home *** CD-ROM | disk | FTP | other *** search
/ Magnum One / Magnum One (Mid-American Digital) (Disc Manufacturing).iso / d1 / intr888.arc / INTERRUP.LST < prev    next >
File List  |  1988-12-01  |  326KB  |  9,238 lines

  1. Please redistribute the following files as a group:
  2.     INTERRUP.LST   this file
  3.     INTERRUP.SUM   a one-line-per-function summary
  4.     INTERRUP.PRI   a brief introduction to interrupts
  5.     INTERRUP.1ST   the read-me file, containing credits
  6. --------------------------------------------------
  7. Release 88.8   Last change 10/29/88
  8. --------------------------------------------------
  9. If you know of any information which is not in this list, or which is incorrect,
  10. please let me know!
  11.  
  12.      Ralf Brown
  13.  
  14. ARPA: ralf@cs.cmu.edu             \
  15. UUCP: {ucbvax,harvard}!cs.cmu.edu!ralf      > preferred
  16. BIT:  ralf%cs.cmu.edu@cmuccvma         /
  17. FIDO: Ralf Brown 1:129/31
  18.  
  19. I reply to all submissions and inquiries, but some of my replies bounce because
  20. of bad return paths.  If you don't get a response from me within a week, send
  21. it again with a better return path.
  22. --------------------------------------------------
  23. Key to system abbreviations
  24. (unless otherwise indicated, a function is available on all systems)
  25.     PC    IBM PC
  26.     XT    IBM PC XT
  27.     PORT    IBM PC Portable (uses same BIOS as XT)
  28.     Jr    IBM PCjr
  29.     AT    IBM PC AT
  30.     XT2    IBM PC XT 2
  31.     XT286    IBM PC XT/286
  32.     CONV    IBM Convertible
  33.     PS    IBM PS/2, any model
  34.     PS30    IBM PS/2 Model 30 and below
  35.     PS50+    IBM PS/2 Model 50,60,70,80
  36.     CGA    Color Graphics Adapter
  37.     EGA    Enhanced Graphics Adapter
  38.     VGA    Video Graphics Array
  39.     MCGA    Multi-Color Graphics Array
  40.     TopView TopView/DESQview/TaskView/other TopView-compatible environments
  41. --------------------------------------------------
  42. To keep the lawyers happy:
  43.  
  44. Microsoft, MS, MS DOS, OS/2 are trademarks of Microsoft Corp.
  45. IBM, PC, PCjr, PC/XT, PC/AT, XT/286, PS/2, TopView are trademarks of IBM Corp.
  46. Compaq is a registered trademark of Compaq Corp.
  47. Tandy 1000 is a registered trademark of Tandy Corp.
  48. DESQview is a trademark of Quarterdeck Office Systems
  49. TaskView is a trademark of Sunny Hill Software
  50. 10-Net is a trademark of Fox Research, Inc.
  51. Mouse Systems is a trademark of Mouse Systems Corp.
  52. NetWare is a trademark of Novell, Inc.
  53. Various other names are trademarks of their respective companies
  54. --------------------------------------------------
  55. The use of -> instead of = signifies that the indicated register or register
  56. pair contains a pointer to the specified item
  57. --------------------------------------------------
  58. INT 00 - internal - DIVIDE ERROR
  59.    Automatically called at end of DIV or IDIV operation that results in error
  60.    or overflow.   Normally set by DOS to display an error message and abort
  61.    the program.
  62. --------------------------------------------------
  63. INT 01 - internal - SINGLE-STEP
  64.    Generated at end of each machine instruction if TF bit in FLAGS is set.
  65.    This is what makes the T command of DEBUG work for single-stepping.    It is
  66.    not generated after MOV to segment register or POP of segment register
  67.    (unless you have a very early 8088 with a microcode bug).
  68. --------------------------------------------------
  69. INT 02 - hardware - NMI (NON-MASKABLE INTERRUPT)
  70.    Generated by NMI signal in hardware.  This signal has various uses:
  71.  
  72.    Parity error: all except Jr and CONV
  73.    Coprocessor interrupt: all except Jr and CONV
  74.    Keyboard interrupt: Jr, CONV
  75.    I/O channel check: CONV, PS50+
  76.    Disk-controller power-on request: CONV
  77.    System suspend: CONV
  78.    Real-time clock: CONV
  79.    System watch-dog timer, time-out interrupt: PS50+
  80.    DMA timer time-out interrupt: PS50+
  81. --------------------------------------------------
  82. INT 03 - ONE-BYTE INTERRUPT
  83.    Generated by opcode CCh.  Generally used to set breakpoints for debuggers.
  84.    Also used by Turbo Pascal versions 1,2,3 when {$U+} specified
  85. --------------------------------------------------
  86. INT 04 - internal - OVERFLOW
  87.    Generated by INTO instruction if OF flag is set.  If flag is not set, INTO
  88.    is effectively a NOP.  Used to trap any arithmetic errors before the
  89.    erroneous results propagate further through the computation.
  90. --------------------------------------------------
  91. INT 05 - PRINT-SCREEN KEY
  92.    Automatically called by keyboard scan when print-screen key is pressed.
  93.    Normally executes routine to print the screen, but may call any routine that
  94.    can safely be executed from inside the keyboard scanner.  Status and result
  95.    byte for default handler is at address 0050:0000.
  96. --------------------------------------------------
  97. INT 05 - internal - BOUND CHECK FAILED (80186/80286)
  98.    Generated by BOUND instruction when the value to be tested is less than the
  99.    indicated lower bound or greater than the indicated upper bound.
  100. --------------------------------------------------
  101. INT 06 - internal - UNDEFINED OPCODE (80286)
  102. --------------------------------------------------
  103. INT 07 - internal - NO MATH UNIT AVAILABLE (80286)
  104. --------------------------------------------------
  105. INT 08 - IRQ0 - TIMER INTERRUPT
  106.    Generated 18.2 times per second, this interrupt is used to keep the
  107.    time-of-day clock updated.
  108. --------------------------------------------------
  109. INT 08 - internal - DOUBLE FAULT (80286 protected mode)
  110.    Called when multiple exceptions occur on one instruction, or an exception
  111.    occurs in an exception handler.  If an exception occurs in the double fault
  112.    handler, the CPU goes into SHUTDOWN mode (which circuitry in the PC/AT
  113.    converts to a reset).
  114. --------------------------------------------------
  115. INT 09 - IRQ1 - KEYBOARD INTERRUPT
  116.    Generated when data is received from the keyboard.  This is normally a scan
  117.    code, but may also be an ACK or NAK of a command on AT-class keyboards.
  118. --------------------------------------------------
  119. INT 09 - internal - MATH UNIT PROTECTION FAULT (80286 protected mode)
  120. --------------------------------------------------
  121. INT 0A - IRQ2 - EGA VERTICAL RETRACE
  122. Notes: on the Tandy 1000, this interrupt is used by the hard disk
  123.        the TOPS and PCnet adapters use this interrupt request line by default
  124. --------------------------------------------------
  125. INT 0A - internal - INVALID TASK STATE SEGMENT (80286 protected-mode)
  126. --------------------------------------------------
  127. INT 0B - IRQ3 - COM2 INTERRUPT
  128. Note:  the TOPS and PCnet adapters use this interrupt request line as an
  129.        alternate
  130. Note:  on PS/2's, COM2 through COM8 share this interrupt
  131.        on many PC's, COM4 shares this interrupt
  132. --------------------------------------------------
  133. INT 0B - internal - NOT PRESENT (80286 protected-mode)
  134.    Generated when loading a segment register if the segment descriptor
  135.    indicates that the segment is not currently in memory.  May be used to
  136.    implement virtual memory.
  137. --------------------------------------------------
  138. INT 0C - IRQ4 - COM1 INTERRUPT
  139. Note: on many PC's, COM3 shares this interrupt
  140. --------------------------------------------------
  141. INT 0C - internal - STACK FAULT (80286 protected-mode)
  142.    Generated on stack overflow/underflow.  Note that the 80286 will shut down
  143.    in real mode if SP=1 before a push.
  144. --------------------------------------------------
  145. INT 0D - IRQ5 - FIXED DISK (PC), LPT2 (AT/PS)
  146. Note: the Tandy 1000 uses this line for the 60Hhz RAM refresh
  147. --------------------------------------------------
  148. INT 0D - internal - GENERAL PROTECTION VIOLATION (80286)
  149.    Called in real mode when an instruction attempts to access a word operand
  150.    located at offset FFFFh
  151. --------------------------------------------------
  152. INT 0E - IRQ6 - DISKETTE INTERRUPT
  153.    Generated by floppy disk controller on completion of an operation
  154. --------------------------------------------------
  155. INT 0E - internal - PAGE FAULT (80386 native mode)
  156. --------------------------------------------------
  157. INT 0F - IRQ7 - PRINTER INTERRUPT
  158.    Generated by the LPT1 printer adapter when printer becomes ready.
  159. Note: most printer adapters do not reliably generate this interrupt.
  160. --------------------------------------------------
  161. INT 10 - internal - COPROCESSOR ERROR (80286/80386)
  162.    Generated by the CPU when the -ERROR pin is asserted by the coprocessor.
  163.    AT's and clones usually wire the coprocessor to use IRQ13, but not all
  164.    get it right.
  165. --------------------------------------------------
  166. INT 10 - VIDEO - SET VIDEO MODE
  167.     AH = 00h
  168.     AL = mode (graphics mode if graphics resolution listed)
  169.          text  pixel graphic color disp scrn  system
  170.          resol    box  resoltn       page addr
  171.        00h = 40x25    8x8         B&W     8    B800 CGA
  172.            = 40x25    8x14         B&W     8    B800 ATI VIP
  173.        01h = 40x25    8x8          16     8    B800 CGA
  174.            = 40x25    8x14          16     8    B800 ATI VIP
  175.        02h = 80x25    8x8         B&W     4    B800 CGA
  176.            = 80x25    8x8         B&W     8    B800 EGA/MCGA/VGA
  177.            = 80x25    8x14         B&W     8    B800 ATI VIP
  178.        03h = 80x25    8x8          16     4    B800 CGA
  179.            = 80x25    8x8          16     8    B800 EGA/MCGA/VGA
  180.        04h = 40x25    8x8  320x200   4     1    B800 CGA
  181.        05h = 40x25    8x8  320x200 4 gray  1    B800 CGA
  182.        06h = 80x25    8x8  640x200 B&W     1    B800 CGA
  183.        07h = 80x25    9x14         mono    1    B000 MDA/Hercules
  184.            = 80x25                 8         EGA/VGA
  185.            = 80x25    9x14         mono    B000 ATI VIP
  186.        08h = 20x25    8x8  160x200  16    B800 PCjr/Tandy 1000
  187.        09h = 40x25    8x8  320x200  16    B800 PCjr/Tandy 1000
  188.        0Ah = 80x25    8x8  640x200   4    B800 PCjr/Tandy 1000
  189.        0Bh = reserved (used internally by EGA BIOS)
  190.        0Ch = reserved (used internally by EGA BIOS)
  191.        0Dh = 40x25    8x8  320x200  16     8    A000 EGA/VGA
  192.        0Eh = 80x25    8x8  640x200  16     4    A000 EGA/VGA
  193.        0Fh = 80x25    8x14 640x350 mono    2    A000 EGA/VGA
  194.        10h = 80x25    8x14 640x350 4or16   2    A000 EGA/VGA
  195.        11h = 80x30    8x16 640x480 mono    A000 VGA/MCGA/ATI EGA/ATI VIP
  196.        12h = 80x30    8x16 640x480  16    A000 VGA/ATI VIP
  197.            = 80x30    8x16 640x480 16/64    A000 ATI EGA Wonder
  198.        13h = 40x25    8x8  320x200 256    A000 VGA/MCGA/ATI VIP
  199.        14h = 80x25    8x8  640x200             Lava Chrome II EGA
  200.        15h = 80x25    8x14 640x350             Lava Chrome II EGA
  201.        16h = 80x25    8x14 640x350             Lava Chrome II EGA
  202.        17h = 80x34    8x14 640x480             Lava Chrome II EGA
  203.        18h = 132x44 8x8         mono         Tseng Labs EVA
  204.            = 80x34    8x14 640x480             Lava Chrome II EGA
  205.        19h = 132x25 8x14         mono         Tseng Labs EVA
  206.        1Ah = 132x28 8x13         mono         Tseng Labs EVA
  207.        22h = 132x44 8x8                 Tseng, Ahead
  208.        23h = 132x25 6x14                 Tseng Labs EVA
  209.            = 132x25 8x14                 Ahead Systems EGA2001
  210.            = 132x25 8x8          16    B800 ATI EGA Wonder/ATI VIP
  211.        24h = 132x28 6x13                 Tseng Labs EVA
  212.        25h = 80x60    8x8  640x480             Tseng Labs EVA
  213.            =         640x480  16         VEGA VGA
  214.        26h = 80x60    8x8                 Tseng Labs EVA
  215.            = 80x60    8x8  640x480             Ahead Systems EGA2001
  216.        27h =         720x512  16         VEGA VGA
  217.            = 132x25 8x8         mono    B000 ATI EGA Wonder/ATI VIP
  218.        28h = ???x???                 VEGA VGA
  219.        29h =         800x600  16         VEGA VGA
  220.        2Dh =         640x350 256         VEGA VGA
  221.        2Eh =         640x480 256         VEGA VGA
  222.        2Fh =         720x512 256         VEGA VGA
  223.        30h =         800x600 256         VEGA VGA
  224.            =         ???x???        B800 AT&T 6300
  225.        33h = 132x44 8x8          16    B800 ATI EGA Wonder/ATI VIP
  226.        36h =         960x720  16         VEGA VGA
  227.        37h =        1024x768  16         VEGA VGA
  228.            = 132x44 8x8         mono    B000 ATI EGA Wonder/ATI VIP
  229.        40h = 80x25    8x16 640x400   2     1    B800 AT&T 6300, Compaq Portable
  230.            = 80x43                     VEGA VGA
  231.        41h =         640x200  16     1         AT&T 6300
  232.            = 132x25                  VEGA VGA
  233.        42h = 80x25    8x16 640x400  16         AT&T 6300
  234.            = 132x43                  VEGA VGA
  235.        43h = unsupported 640x200 of 640x400 viewport  AT&T 6300
  236.            = 80x60                     VEGA VGA
  237.        44h = disable VDC and DEB output         AT&T 6300
  238.            = 100x60                  VEGA VGA
  239.        48h = 80x50    8x8  640x400   2    B800 AT&T 6300
  240.        49h = 80x30    8x16 640x480             Lava Chrome II EGA
  241.        4Dh = 120x25                  VEGA VGA
  242.        4Eh = 120x43                  VEGA VGA
  243.        4Fh = 132x25                  VEGA VGA
  244.        50h = 132x25 9x14         mono         Ahead Systems EGA2001
  245.            = 80x30    8x16 640x480  16         Paradise EGA-480
  246.            = 80x43             mono         VEGA VGA
  247.            =         640x480 mono???         Taxan 565 EGA
  248.            = 80x34                     Lava Chrome II EGA
  249.        51h = 80x30    8x16                 Paradise EGA-480
  250.            = 132x25          mono         VEGA VGA
  251.            = 80x34    8x14 640x480  16         ATI EGA Wonder
  252.            = 80x30                     Lava Chrome II EGA
  253.        52h = 132x44 9x8         mono         Ahead Systems EGA2001
  254.            = 132x43          mono         VEGA VGA
  255.            = 94x29    8x14 752x410  16         ATI EGA Wonder
  256.            = 80x60                     Lava Chrome II EGA
  257.        53h = 100x40 8x14 800x560  16         ATI EGA Wonder/ATI VIP
  258.            = 132x43                  Lava Chrome II EGA
  259.        54h = 132x43 8x8                 Paradise EGA-480
  260.            = 132x43 7x9         16/256k    B800 Paradise VGA
  261.            = 132x43 8x9         16/256k    B800 Paradise VGA on multisync
  262.            = 132x43                     Taxan 565 EGA
  263.            = 100x42 8x14 800x600  16    A000 ATI EGA Wonder
  264.            = 132x25                  Lava Chrome II EGA
  265.        55h = 132x25 8x14                 Paradise EGA-480
  266.            = 132x25 7x16         16/256k    B800 Paradise VGA
  267.            = 132x25 8x16         16/256k    B800 Paradise VGA on multisync
  268.            = 132x25                     Taxan 565 EGA
  269.            = 80x66    8x8         16/256k    A000 ATI VIP
  270.            = 94x29    8x14 752x410             Lava Chrome II EGA
  271.        56h = 132x43 8x8         3???    2    B000 NSI Smart EGA+
  272.            = 132x43 7x9           4    B000 Paradise VGA
  273.            = 132x43 8x9           4    B000 Paradisk VGA on multisync
  274.            = 132x43          mono         Taxan 565 EGA
  275.        57h = 132x25 8x14         3???    4    B000 NSI Smart EGA+
  276.            = 132x25 7x16           4    B000 Paradise VGA
  277.            = 132x25 8x16           4    B000 Paradise VGA on multisync
  278.            = 132x25          mono         Taxan 565 EGA
  279.        58h = 100x75 8x8  800x600 16/256k    A000 Paradise VGA
  280.            = 80x33    8x14          16    B800 ATI EGA Wonder/ATI VIP
  281.        59h = 100x75 8x8  800x600   2    A000 Paradise VGA
  282.            = 80x66    8x8         16/256k    A000 ATI VIP
  283.        5Eh =         640x400 256         Paradise VGA,VEGA VGA
  284.        5Fh =         640x480 256         Paradise VGA
  285.        60h = 80x???      ???x400             Corona/Cordata BIOS v4.10+
  286.            =         752x410             VEGA VGA
  287.        61h =         ???x400             Corona/Cordata BIOS v4.10+
  288.            =         720x540             VEGA VGA
  289.        62h =         800x600             VEGA VGA
  290.        70h = extended mode set (see below)         Everex Micro Enhancer EGA
  291.        71h = 100x35 8x16 800x600 16of64    A000 NSI Smart EGA+
  292.        74h =         640x400   2    B800 Toshiba 3100 AT&T mode
  293.        7Eh = special mode set (see below)         Paradise VGA
  294.        7Fh = special function set (see below)    Paradise VGA
  295.        82h = 80x25             B&W         AT&T VDC overlay mode *
  296.        83h = 80x25                     AT&T VDC overlay mode *
  297.        86h =         640x200 B&W         AT&T VDC overlay mode *
  298.        C0h =         640x400   2/prog pallet AT&T VDC overlay mode *
  299.        C4h = disable output              AT&T VDC overlay mode *
  300.        D0h =         640x400   2    B800 DEC VAXmate AT&T mode
  301.        ??? =         640x225             Z-100
  302.        ??? =         640x400             Z-100
  303.  
  304. * for AT&T VDC overlay modes, BL contains the DEB mode, which may be 06h,
  305.       40h, or 44h
  306. Note: IBM standard modes do not clear the screen if the high bit of AL is set
  307. --------------------------------------------------
  308. INT 10 - VIDEO - Everex Micro Enhancer EGA - EXTENDED MODE SET
  309.     AX = 0070h
  310.     BL = mode (graphics mode if graphics resolution listed)
  311.          text  pixel graphic color disp scrn  monitor
  312.          resol    box  resoltn       page addr
  313.        00h =         640x480              multisync'ing
  314.        01h =         752x410              multisync'ing
  315.        02h = reserved
  316.        03h = 80x34                      multisync'ing
  317.        04h = 80x60                      multisync'ing
  318.        05h = 94x29                      multisync'ing
  319.        06h = 94x51                      multisync'ing
  320.        07h = reserved
  321.        08h = reserved
  322.        09h = 80x44                      EGA
  323.        0Ah = 132x25                   EGA
  324.        0Bh = 132x44                   EGA
  325.        0Ch = 132x25                   CGA
  326.        0Dh = 80x44                      mono
  327.        0Eh = 132x25                   mono
  328.        0Fh = 132x44                   mono
  329. --------------------------------------------------
  330. INT 10 - VIDEO - Paradise VGA - SET SPECIAL MODE
  331.     AX = 007Eh
  332.     BX = The horizontal dimension of the mode desired
  333.     CX = The vertical dimension of the mode desired
  334.          (both BX/CX in pixels for graphics modes, rows for alpha modes)
  335.     DX = The number of colors of the mode desired
  336.          (use 0 for monochrome modes)
  337. Return: BH = 7Eh if successful.
  338. --------------------------------------------------
  339. INT 10 - VIDEO - Paradise VGA - EXTENDED FUNCTIONS
  340.     AX = 007Fh
  341.     BH = 00h  set VGA operation
  342.     BH = 01h  set non-VGA operation
  343.         Color modes (0,1,2,3,4,5,6) will set non-VGA CGA operation.
  344.         Monochrome mode 7 will set non-VGA MDA/Hercules operation.
  345.     BH = 02h  query mode status
  346.         Return: BL = 0 if operating in VGA mode, 1 if non-VGA mode.
  347.             CH = Total video RAM size in 64k byte units.
  348.             CL = Video RAM used by the current mode.
  349.     BH = 03h  lock current mode
  350.         Allows current mode (VGA or non-VGA) to survive re-boot.
  351.     BH = 0Ah,0Bh,0Ch,0Dh,0Eh,0Fh  WRITE PARADISE REGISTERS 0,1,2,3,4,5
  352.         (port 03CEh indices A,B,C,D,E,F)
  353.         BL = Value to set in the paradise register.
  354.     BH = 1Ah,1Bh,1Ch,1Dh,1Eh,1Fh READ PARADISE REGISTERS 0,1,2,3,4,5
  355.          (port 03CEh indices A,B,C,D,E,F)
  356.         Return: BL = Value of the paradise register.
  357.             BH = 7Fh if successful.
  358. --------------------------------------------------
  359. INT 10 - VIDEO - SET CURSOR CHARACTERISTICS
  360.     AH = 01h
  361.     CH bits 0-4 = start line for cursor in character cell
  362.        bits 5-6 = blink attribute
  363.              (00=normal, 01=invisible, 10=slow, 11=fast)
  364.     CL bits 0-4 = end line for cursor in character cell
  365. Note: buggy on EGA systems--BIOS remaps cursor shape in 43 line modes, but
  366.       returns unmapped cursor shape
  367. --------------------------------------------------
  368. INT 10 - VIDEO - SET CURSOR POSITION
  369.     AH = 02h
  370.     DH,DL = row, column (0,0 = upper left)
  371.     BH = page number
  372.         0 in graphics modes
  373.         0-3 in modes 2&3
  374.         0-7 in modes 0&1
  375. --------------------------------------------------
  376. INT 10 - VIDEO - READ CURSOR POSITION
  377.     AH = 03h
  378.     BH = page number
  379.         0 in graphics modes
  380.         0-3 in modes 2&3
  381.         0-7 in modes 0&1
  382. Return: DH,DL = row,column
  383.     CH = cursor start line
  384.     CL = cursor end line
  385. --------------------------------------------------
  386. INT 10 - VIDEO - READ LIGHT PEN POSITION (all but PS)
  387.     AH = 04h
  388. Return: AH = 0: light pen switch not activated
  389.     AH = 1: light pen values in registers
  390.         DH,DL = row,column of current position
  391.         CH = raster line (0-199) (EGA) old graphics modes
  392.         CX = (EGA) raster line (0-nnn) new graphics modes
  393.         BX = pixel column (0-319 or 0-639)
  394. --------------------------------------------------
  395. INT 10 - VIDEO - SELECT DISPLAY PAGE
  396.     AH = 05h
  397.     AL =
  398.         0-7: new page value for modes 0 & 1
  399.         0-3: new page value for modes 2 & 3
  400.         80h: read CRT/CPU page registers [PCjr only]
  401.         81h: set CPU page register to value in BL [PCjr only]
  402.         82h: set CRT page register to value in BH [PCjr only]
  403.         83h: set both display registers to values in BH, BL [PCjr only]
  404.         {Corona/Cordata BIOS v4.10+}
  405.         00h: set address of graphics bitmap buffer (video modes 60h,61h)
  406.            BX = segment of buffer
  407.         0Fh: get address of graphics bitmap buffer (video modes 60h,61h)
  408. Return: BH = CRT page register (if AL >= 80h)
  409.     BL = CPU page register (if AL >= 80h)
  410.     DX = segment of graphics bitmap buffer (video modes 60h,61h; AL=0Fh)
  411. --------------------------------------------------
  412. INT 10 - VIDEO - SCROLL PAGE UP
  413.     AH = 06h
  414.     AL = number of lines to scroll window (0 = blank whole window)
  415.     BH = attributes to be used on blanked lines
  416.     CH,CL = row,column of upper left corner of window to scroll
  417.     DH,DL = row,column of lower right corner of window
  418. --------------------------------------------------
  419. INT 10 - VIDEO - SCROLL PAGE DOWN
  420.     AH = 07h
  421.     AL = number of lines to scroll window (0 = blank whole window)
  422.     BH = attributes to be used on blanked lines
  423.     CH,CL = row,column of upper left corner of window to scroll
  424.     DH,DL = row,column of lower right corner of window
  425. --------------------------------------------------
  426. INT 10 - VIDEO - READ ATTRIBUTES/CHARACTER AT CURSOR POSITION
  427.     AH = 08h
  428.     BH = display page
  429. Return: AL = character
  430.     AH = attribute of character (alpha modes)
  431. --------------------------------------------------
  432. INT 10 - VIDEO - WRITE ATTRIBUTES/CHARACTERS AT CURSOR POS
  433.     AH = 09h
  434.     AL = character
  435.     BH = display page
  436.     BL = attributes of char (alpha modes) or color (graphics modes)
  437.          if bit 7 == 1 in graphics mode, character is xor'ed onto screen
  438.     CX = number of times to write character
  439. Note: all characters are displayed, including CR, LF, and BS
  440. --------------------------------------------------
  441. INT 10 - VIDEO - WRITE CHARACTERS ONLY AT CURSOR POS
  442.     AH = 0Ah
  443.     AL = character
  444.     BH = display page - alpha mode
  445.     BL = color of character (graphics mode, PCjr only)
  446.          if bit 7 == 1 in graphics mode, character is xor'ed onto screen
  447.     CX = number of times to write character
  448.          (EGA) in graphics modes, replication count in CX works correctly
  449.          only if all character written are contains on the same row
  450. Note: all characters are displayed, including CR, LF, and BS
  451. --------------------------------------------------
  452. INT 10 - VIDEO - SET COLOR PALETTE
  453.     AH = 0Bh
  454.     BH = 0
  455.         BL = border color (0-15) (text modes)
  456.          border color and background color (graphics modes)
  457.         (EGA)
  458.         BL = border color (0-15) and high-intensity background color
  459.           (16-31??? maybe should be high nybble?)
  460.     BH = 1
  461.         BL = palette (0-3)
  462. --------------------------------------------------
  463. INT 10 - VIDEO - WRITE DOT ON SCREEN
  464.     AH = 0Ch
  465.     AL = color of dot (0/1 in mode 6, 0-3 in modes 4 and 5)
  466.          if bit 7 set, new color will be XORed with current pixel
  467.     BH = display page (ignored if mode only supports one page)
  468.     CX = column
  469.     DX = row
  470. Note: only valid in graphics modes
  471. --------------------------------------------------
  472. INT 10 - VIDEO - READ DOT ON SCREEN
  473.     AH = 0Dh
  474.     BH = display page (ignored if mode only supports one page)
  475.     CX = column
  476.     DX = row
  477. Return: AL = color read
  478. Note: only valid in graphics modes
  479. --------------------------------------------------
  480. INT 10 - VIDEO - WRITE CHARACTER AND ADVANCE CURSOR (TTY WRITE)
  481.     AH = 0Eh
  482.     AL = character
  483.     BH = display page (alpha modes)
  484.     BL = foreground color (graphics modes)
  485. Note: characters 07h (BEL), 08h (BS), 0Ah (LF), and 0Dh (CR) are interpreted
  486.       and do the expected things
  487. --------------------------------------------------
  488. INT 10 - VIDEO - GET CURRENT VIDEO MODE
  489.     AH = 0Fh
  490. Return: AH = number of columns on screen
  491.     AL = current video mode (see INT 10h/AH=00h)
  492.     BH = current active display page
  493. Note:    if mode was set with bit 7 set ("no blanking"), the returned mode will
  494.     also have bit 7 set
  495. --------------------------------------------------
  496. INT 10 - VIDEO - SET PALETTE REGISTERS (Jr, PS, TANDY 1000, EGA, VGA)
  497.     AH = 10h
  498.     AL = subfunction
  499.         00h set palette register
  500.         BL = palette register to set
  501.         BH = color value to store
  502.         (on MCGA, only BX = 0712h is supported)
  503.         01h set border color register
  504.         BH = color value to store
  505.         02h set all palette registers and overscan
  506.         ES:DX -> 17-byte list
  507.            bytes 0-15 = values for palette regs. 0-15
  508.            byte 16 = value for border color register
  509. --------------------------------------------------
  510. INT 10 - VIDEO - TOGGLE INTENSITY/BLINKING BIT (Jr, PS, TANDY 1000, EGA, VGA)
  511.     AX = 1003h
  512.     BL = 00h enable intensity
  513.        = 01h enable blink
  514. --------------------------------------------------
  515. INT 10 - VIDEO - GET PALETTE REGISTERS (VGA)
  516.     AH = 10h
  517.     AL = subfunction
  518.         07h read individual palette register
  519.         BL = palette register number
  520.         Return: BH = palette register value
  521.         08h read overscan (border color) register
  522.         Return: BH = value
  523.         09h read all palette registers and overscan register
  524.         ES:DX = buffer address (17 bytes)
  525. --------------------------------------------------
  526. INT 10 - VIDEO - GET/SET DAC REGISTERS (EGA, VGA/MCGA)
  527.     AH = 10h
  528.     AL = subfunction
  529.         10h set individual DAC register
  530.         BX = register number
  531.         CH = new value for green (0-63)
  532.         CL = new value for blue (0-63)
  533.         DH = new value for red (0-63)
  534.         12h set block of DAC registers
  535.         BX = starting color register
  536.         CX = number of registers to set
  537.         ES:DX = Table of 3*CX bytes where each 3 byte
  538.         group represents one byte each of red, green and blue (0-63)
  539.         13h select video DAC color page (VGA only)
  540.         BL = 00h Select paging mode
  541.             BH = 00h Select 4 blocks of 64
  542.             BH = 01h Select 16 blocks of 16
  543.         BL = 01h Select Page
  544.             BH = page number (00h to 03h) or (00h to 0Fh)
  545.         (not valid in mode 13h)
  546.         15h read individual DAC register
  547.         BL = palette register number
  548.         Return: DH = red value
  549.             CH = green value
  550.             CL = blue value
  551.         17h read block of DAC registers
  552.         BX = starting palette register
  553.         CX = number of palette registers to read
  554.         ES:DX = buffer (3 * CX bytes in size)
  555.         Return: CX number of red, green and blue triples in buffer
  556.         18h *UNDOCUMENTED* set PEL mask
  557.         BL = new PEL value
  558.         19h *UNDOCUMENTED* read PEL mask
  559.         BL = value read
  560.         1Ah read video DAC color-page state (VGA only)
  561.         Return: BL = paging mode
  562.                 0 four pages of 64
  563.                 1 sixteen pages of 16
  564.             BH = current page
  565.         1Bh perform gray-scale summing
  566.         BX = starting palette register
  567.         CX = number of registers to convert
  568. --------------------------------------------------
  569. INT 10 - VIDEO - TEXT-MODE CHARACTER GENERATOR FUNCTIONS (PS, EGA, VGA)
  570.     AH = 11h
  571.     The following functions will cause a mode set, completely resetting
  572.     the video environment, but without clearing the video buffer
  573.     AL = 00h, 10h: load user-specified patterns
  574.         ES:BP -> user table
  575.         CX      = count of patterns to store
  576.         DX      = character offset into map 2 block
  577.         BL      = block to load in map 2
  578.         BH      = number of bytes per character pattern
  579.     AL = 01h, 11h: load ROM monochrome patterns (8 by 14)
  580.         BL      = block to load
  581.     AL = 02h, 12h: load ROM 8 by 8 double-dot patterns
  582.         BL      = block to load
  583.     AL = 03h: set block specifier
  584.         BL      = block specifier
  585.            (EGA/MCGA) bits 0,1 = block selected by chars with attribute
  586.                      bit 3 = 0
  587.                   bits 2,3 = block selected by chars with attribute
  588.                      bit 3 = 1
  589.            (VGA) bits 0,1,4 = block selected by attribute bit 3 = 0
  590.              bits 2,3,5 = block selected by attribute bit 3 = 1
  591.     AL = 04h, 14h: load ROM 8x16 character set (VGA)
  592.     The routines called with AL=1xh are designed to be called only
  593.     immediately after a mode set and are similar to the routines called
  594.     with AL=0xh, except that:
  595.           Page 0 must be active.
  596.           Bytes/character is recalculated.
  597.           Max character rows is recalculated.
  598.           CRT buffer length is recalculated.
  599.           CRTC registers are reprogrammed as follows:
  600.              R09 = bytes/char-1 ; max scan line (mode 7 only)
  601.              R0A = bytes/char-2 ; cursor start
  602.              R0B = 0        ; cursor end
  603.              R12 = ((rows+1)*(bytes/char))-1 ; vertical display end
  604.              R14 = bytes/char    ; underline loc
  605.                (*** BUG: should be 1 less ***)
  606. --------------------------------------------------
  607. INT 10 - VIDEO - GRAPHICS-MODE CHARACTER GENERATOR FUNCTIONS (PS, EGA, VGA)
  608.     AH = 11h
  609.     AL = 20h: set user 8 by 8 graphics characters (INT 1Fh)
  610.         ES:BP -> user table
  611.     AL = 21h: set user graphics characters
  612.         ES:BP -> user table
  613.         CX      = bytes per character
  614.         BL      = row specifier
  615.            0: user set
  616.               DL = number of rows
  617.            1: 14 rows
  618.            2: 25 rows
  619.            3: 43 rows
  620.     AL = 22h: ROM 8 by 14 set
  621.         BL = row specifier
  622.     AL = 23h: ROM 8 by 8 double dot
  623.         BL = row specifier
  624.     AL = 24h: load 8x16 graphics characters (VGA/MCGA)
  625.         BL = row specifier
  626. Note: these functions are meant to be called only after a mode set
  627. --------------------------------------------------
  628. INT 10 - VIDEO - GET FONT INFORMATION (EGA, MCGA, VGA)
  629.     AX = 1130h
  630.     BH = pointer specifier
  631.         0: INT 1Fh pointer
  632.         1: INT 44h pointer
  633.         2: ROM 8 by 14 character font pointer
  634.         3: ROM 8 by 8 double dot font pointer
  635.         4: ROM 8 by 8 DD font (top half)
  636.         5: ROM alpha alternate (9 by 14) pointer
  637. Return: ES:BP = specified pointer
  638.     CX    = bytes/character
  639.     DL    = character rows on screen
  640. --------------------------------------------------
  641. INT 10 - VIDEO - ALTERNATE FUNCTION SELECT (PS, EGA, VGA, MCGA)
  642.     AH = 12h
  643.     BL = 10h: return EGA information
  644.          Return: BH = 0: color mode in effect (3Dx)
  645.               1: mono mode in effect (3Bx)
  646.              BL = 0:  64k bytes memory installed
  647.               1: 128k bytes memory installed
  648.               2: 192k bytes memory installed
  649.               3: 256k bytes memory installed
  650.              CH = feature bits
  651.              CL = switch settings
  652.     BL = 20h: select alternate print screen routine
  653.     BL = 30h: select vertical resolution for alphanumeric modes (VGA only)
  654.          AL = 00h 200 scan lines
  655.           01h 350 scan lines
  656.           02h 400 scan lines
  657.          Return: AL = 12h if function supported
  658.     BL = 31h: enable/disable default palette loading (VGA/MCGA)
  659.          AL = 00h enable default palette loading
  660.           01h disable default palette loading
  661.          Return: AL = 12h if function was supported
  662.     BL = 32h: enable/disable video addressing (VGA/MCGA)
  663.          AL = 00h enable video
  664.           01h disable video
  665.          Return: AL = 12h if function was supported
  666.     BL = 33h: enable/disable default gray-scale summing (VGA/MCGA)
  667.          AL = 00h enable gray scale summing
  668.           01h disable gray scale summing
  669.          Return: AL = 12h if function was supported
  670.     BL = 34h: enable/disable alphanumeric cursor emulation (VGA only)
  671.          AL = 00h enable cursor emulation
  672.           01h disable cursor emulation
  673.          Return: AL = 12h if function was supported
  674.     BL = 35h: PS/2 display-switch interface
  675.          AL = 00h initial adapter video off
  676.           01h initial planar video on
  677.           02h switch active video off
  678.           03h switch inactive video on
  679.           80h *UNDOCUMENTED* set system board video active flag
  680.          ES:DX = buffer (128 byte save area if AL = 0, 2 or 3)
  681.          Return: AL = 12h if function was supported
  682.     BL = 36h: video refresh control (VGA/PS)
  683.          AL = 00h enable refresh
  684.           01h disable refresh
  685.          Return: AL = 12h if function supported
  686.     BX = 5500h ??? (used by ATI and TAXAN)
  687.     BX = 5502h ??? (used by ATI and TAXAN)
  688. --------------------------------------------------
  689. INT 10 - VIDEO - WRITE STRING (AT,XT286,PS,EGA,VGA)
  690.     AH = 13h
  691.     AL = mode
  692.         bit 0: set in order to move cursor after write
  693.         bit 1: set if string contains alternating characters and attributes
  694.     BL = attribute if AL bit 1 clear
  695.     BH = display page number
  696.     DH,DL = row,column of starting cursor position
  697.     CX = length of string
  698.     ES:BP -> start of string
  699. Note: recognizes CR, LF, BS, and bell
  700. --------------------------------------------------
  701. INT 10 - VIDEO - LOAD LCD CHARACTER FONT (CONVERTIBLE)
  702.     AH = 14h
  703.     AL = 0 load user-specified font
  704.         ES:DI -> character font
  705.         BH = number of bytes per character
  706.         BL = 0: load main font (block 0)
  707.          1: load alternate font (block 1)
  708.         CX = number of characters to store
  709.         DX = character offset into RAM font area
  710.     AL = 1 load system rom default font
  711.         BL = 0: load main font (block 0)
  712.          1: load alternate font (block 1)
  713.     AL = 2 set mapping of LCD high intensity attributes
  714.         BL = 0: ignore high intensity attribute
  715.          1: map high intensity to underscore
  716.          2: map high intensity to reverse video
  717.          3: map high intensity to selected alternate font
  718. --------------------------------------------------
  719. INT 10 - VIDEO - GET PHYSICAL DISPLAY PARAMETERS (CONVERTIBLE)
  720.     AH = 15h
  721. Return: AX = alternate display adapter type
  722.         0000h none
  723.         5140h LCD
  724.         5153h CGA
  725.         5151h mono
  726.     ES:DI -> parameter table
  727.            word 0: monitor model number
  728.             1: vertical pixels per meter
  729.             2: horizontal pixels per meter
  730.             3: total vertical pixels
  731.             4: total horizontal pixels
  732.             5: horizontal pixel separation in micrometers
  733.             6: vertical pixel separation in micrometers
  734. --------------------------------------------------
  735. INT 10 - VIDEO - DISPLAY COMBINATION (PS,VGA/MCGA)
  736.     AH = 1Ah
  737.     AL = 00h read display combination code
  738.         Return: BL = active display code
  739.             BH = alternate display code
  740.          01h set display combination code
  741.         BL = active display code
  742.         BH = alternate display code
  743. Return: AL = 1Ah if function was supported
  744.  
  745. Display combination codes:
  746.     00h no display
  747.     01h monochrome adapter w/ monochrome display
  748.     02h CGA w/ color display
  749.     03h reserved
  750.     04h EGA w/ color display
  751.     05h EGA w/ monochrome display
  752.     06h PGA w/ color display
  753.     07h VGA w/ monochrome analog display
  754.     08h VGA w/ color analog display
  755.     09h reserved
  756.     0Ah MCGA w/ digital color display
  757.     0Bh MCGA w/ monochrome analog display
  758.     0Ch MCGA w/ color analog display
  759.     FFh unknown display type
  760. --------------------------------------------------
  761. INT 10 - VIDEO - FUNCTIONALITY/STATE INFORMATION (PS,VGA/MCGA)
  762.     AH = 1Bh
  763.     BX = implementation type
  764.        = 0000h return funtionality/state information
  765.     ES:DI -> 64 byte buffer
  766. Return: AL = 1Bh if function supported
  767.     ES:DI buffer filled
  768.         00h address of static funtionality table
  769.         04h video mode in effect
  770.         05h number of columns
  771.         07h length of regen buffer in bytes
  772.         09h starting address of regen buffer
  773.         0Bh cursor position for page 0
  774.         0Dh cursor position for page 1
  775.         0Fh cursor position for page 2
  776.         11h cursor position for page 3
  777.         13h cursor position for page 4
  778.         15h cursor position for page 5
  779.         17h cursor position for page 6
  780.         19h cursor position for page 7
  781.         1Bh cursor type
  782.         1Dh active display page
  783.         1Eh CRTC port address
  784.         20h current setting of register (3?8)
  785.         21h current setting of register (3?9)
  786.         22h number of rows
  787.         23h bytes/character
  788.         25h DCC of active display
  789.         26h DCC of alternate display
  790.         27h number of colors supported in current mode
  791.         29h number of pages supported in current mode
  792.         2Ah number of scan lines active
  793.          (0,1,2,3) = (200,350,400,480)
  794.         2Bh primary character block
  795.         2Ch secondary character block
  796.         2Dh Miscellaneous flags
  797.            bit 0 all modes on all displays on
  798.            1 gray summing on
  799.            2 monochrome display attached
  800.            3 default palette loading disabled
  801.            4 cursor emulation enabled
  802.            5 0 = intensity; 1 = blinking
  803.            6 reserved
  804.            7 reserved
  805.         2Eh to 30h reserved
  806.         31h video memory available
  807.         00h = 64K, 01h = 128K, 02h = 192K, 03h = 256K
  808.         32h save pointer state flags
  809.            bit 0 512 character set active
  810.            1 dynamic save area present
  811.            2 alpha font override active
  812.            3 graphics font override active
  813.            4 palette override active
  814.            5 DCC override active
  815.            6 reserved
  816.            7 reserved
  817.         33h to 3Fh reserved
  818.  
  819. State Functionality Table format (16 bytes)
  820.     00h modes supported #1
  821.         bit 0 to bit 7 = 1 modes 0,1,2,3,4,5,6 supported
  822.     01h modes supported #2
  823.         bit 0 to bit 7 = 1 modes 8,9,A,B,C,D,E,F supported
  824.     02h modes supported #3
  825.         bit 0 to bit 3 = 1 modes 10,11,12,13 supported
  826.         bit 4 to bit 7 reserved
  827.     03h to 06h reserved
  828.     07h scan lines supported
  829.         bit 0 to bit 2 = 1 if scan lines 200,350,400 supported
  830.     08h total number of character blocks available in text modes
  831.     09h maximum number of active character blocks in text modes
  832.     0Ah miscellaneous function flags #1
  833.         bit 0 all modes on all displays function supported
  834.         1 gray summing function supported
  835.         2 character font loading function supported
  836.         3 default palette loading enable/disable supported
  837.         4 cursor emulation function supported
  838.         5 EGA palette present
  839.         6 color palette present
  840.         7 color paging function supported
  841.     0Bh miscellaneous function flags #2
  842.         bit 0 light pen supported
  843.         1 save/restore state function 1Ch supported
  844.         2 intensity blinking function supported
  845.         3 Display Combination Code supported
  846.         4-7 reserved
  847.     0Ch to 0Dh reserved
  848.     0Eh Save pointer function flags
  849.         bit 0 512 character set supported
  850.         1 dynamic save area supported
  851.         2 alpha font override supported
  852.         3 graphics font override supported
  853.         4 palette override supported
  854.         5 DCC extension supported
  855.         6 reserved
  856.         7 reserved
  857.     0Fh reserved
  858. --------------------------------------------------
  859. INT 10 - VIDEO - SAVE/RESTORE VIDEO STATE (PS50+,VGA)
  860.     AH = 1Ch
  861.     CX = requested states
  862.          bit 0 video hardware
  863.          1 BIOS data areas
  864.          2 color registers and DAC state
  865.          3-15 reserved
  866.     AL = 0: return state buffer size
  867.         Return: BX = number of 64 byte blocks needed
  868.          1: save video state
  869.         ES:BX = buffer address
  870.          2: restore video state
  871.         ES:BX = buffer address of previously saved state
  872. Return: AL = 1Ch if function supported
  873. --------------------------------------------------
  874. INT 10 - VIDEO - SET GRAPHICS MODE (Hercules GRAFIX)
  875.     AH = 40h
  876. --------------------------------------------------
  877. INT 10 - VIDEO - SET TEXT MODE (Hercules GRAFIX)
  878.     AH = 41h
  879. --------------------------------------------------
  880. INT 10 - VIDEO - CLEAR CURRENT PAGE (Hercules GRAFIX)
  881.     AH = 42h
  882. --------------------------------------------------
  883. INT 10 - VIDEO - SELECT DRAWING PAGE (Hercules GRAFIX)
  884.     AH = 43h
  885.     AL = page number (0,1)
  886. --------------------------------------------------
  887. INT 10 - VIDEO - SELECT DRAWING FUNCTION (Hercules GRAFIX)
  888.     AH = 44h
  889.     AL = drawing function
  890.         00h clear pixels
  891.         01h set pixels
  892.         02h invert pixels
  893. --------------------------------------------------
  894. INT 10 - VIDEO - SELECT PAGE TO DISPLAY (Hercules GRAFIX)
  895.     AH = 45h
  896.     AL = page number (0,1)
  897. --------------------------------------------------
  898. INT 10 - VIDEO - DRAW ONE PIXEL (Hercules GRAFIX)
  899.     AH = 46h
  900.     DI = x (0-720)
  901.     BP = y (0-347)
  902. Note:    function 44h determines operation and function 43h which page to use
  903. --------------------------------------------------
  904. INT 10 - VIDEO - FIND PIXEL VALUE (Hercules GRAFIX)
  905.     AH = 47h
  906.     DI = x (0-720)
  907.     BP = y (0-347)
  908. Return: AL = 0 pixel clear
  909.     AL = 1 pixel set
  910. Note:    function 43h specifies which page is used
  911. --------------------------------------------------
  912. INT 10 - VIDEO - MOVE TO POINT (Hercules GRAFIX)
  913.     AH = 48h
  914.     DI = x (0-720)
  915.     BP = y (0-347)
  916. --------------------------------------------------
  917. INT 10 - VIDEO - DRAW TO POINT (Hercules GRAFIX)
  918.     AH = 49h
  919.     DI = x (0-720)
  920.     BP = y (0-347)
  921. Note:    function 48h or 49h specify first point, 44h operation and 43h page
  922.     to use
  923. --------------------------------------------------
  924. INT 10 - VIDEO - BLOCK FILL (Hercules GRAFIX)
  925.     AH = 4Ah
  926. --------------------------------------------------
  927. INT 10 - VIDEO - DISPLAY CHARACTER (Hercules GRAFIX)
  928.     AH = 4Bh
  929.     AL = character to display
  930.     DI = x (0-720)
  931.     BP = y (0-347)
  932. Note: Unlike the other BIOS character functions character position is
  933.       specified in pixels rather than rows and columns.
  934. --------------------------------------------------
  935. INT 10 - VIDEO - DRAW ARC (Hercules GRAFIX)
  936.     AH = 4Ch
  937. --------------------------------------------------
  938. INT 10 - VIDEO - DRAW CIRCLE (Hercules GRAFIX)
  939.     AH = 4Dh
  940. --------------------------------------------------
  941. INT 10 - VIDEO - FILL AREA (Hercules GRAFIX)
  942.     AH = 4Eh
  943. --------------------------------------------------
  944. INT 10 - Direct Graphics Interface Standard (DGIS) - INQUIRE AVAILABLE DEVICES
  945.     AX = 6A00h
  946.     BX = 0
  947.     CX = 0
  948.     DX = buffer length (may be 0)
  949.     ES:DI = address of buffer
  950. Return: BX = number of bytes stored in buffer
  951.     CX = bytes required for all descriptions (0 if no DGIS)
  952. Note:    buffer contains descriptions and addresses of DGIS-compatible display(s)
  953.     and printer(s)
  954. --------------------------------------------------
  955. INT 10 - DGIS - REDIRECT CHARACTER OUTPUT
  956.     AX = 6A01h
  957.     CX = 0
  958.     ES:DI = address of device to send INT 10 output to
  959. Return: CX = 0      output could not be redirected
  960.          else INT 10h output now routed to requested display
  961. --------------------------------------------------
  962. INT 10 - DGIS - INQUIRE INT 10 OUTPUT DEVICE
  963.     AX = 6A02h
  964.     ES:DI = 0:0
  965. Return: ES:DI = 0:0  if current display is non-DGIS
  966.         else address of the current DGIS INT 10 display
  967. --------------------------------------------------
  968. INT 10 - VIDEO - SET VIDEO MODE (VEGA EXTENDED EGA/VGA)
  969.     AX = 6F05h
  970.     BL = mode (graphics mode if graphics resolution listed)
  971.          text  pixel graphic color disp scrn  system
  972.          resol    box  resoltn       page addr
  973.        62h =         800x600  16         VEGA Extended EGA
  974.        65h =        1024x768  16         VEGA Extended EGA
  975.        66h =         640x400 256         VEGA Extended VGA
  976.        67h =         640x480 256         VEGA Extended VGA
  977.        68h =         720x540 256         VEGA Extended VGA
  978.        69h =         800x600 256         VEGA Extended VGA
  979. --------------------------------------------------
  980. INT 10 - VIDEO - GET VIDEO RAM ADDRESS (TANDY 1000)
  981.     AH = 70h
  982. Return: AX  = segment address of the following
  983.     [BX] = offset address of green plane
  984.     [CX] = segment address of green plane
  985.     [DX] = segment address of red/blue plane
  986.            (red offset = 0, blue offset = 4000)
  987. --------------------------------------------------
  988. INT 10 - VIDEO - GET INCRAM ADDRESSES (TANDY 1000)
  989.     AH = 71h
  990. Return: AX  = segment address of the following
  991.     [BX] = segment address of INCRAM
  992.     [CX] = offset address of INCRAM
  993. --------------------------------------------------
  994. INT 10 - VIDEO - SCROLL SCREEN RIGHT (TANDY 1000)
  995.     AH = 72h
  996.     AL = number of columns blanked at left of window
  997.          0 = blank entire window
  998.     BH = attributes to be used on blank columns
  999.     CH,CL = row, column of upper left corner of window
  1000.     DH,DL = row, column of lower right corner
  1001. -------------------------------------------------
  1002. INT 10 - VIDEO - SCROLL SCREEN LEFT (TANDY 1000)
  1003.     AH = 73h
  1004.     AL = number of columns blanked at right of window
  1005.          0 = blank entire window
  1006.     BH = attributes to be used on blank columns
  1007.     CH,CL = row, column of upper left corner of window
  1008.     DH,DL = row, column of lower right corner
  1009. --------------------------------------------------
  1010. INT 10 - VIDEO (DESQview) - SET ??? HANDLER
  1011.     AH = 80h
  1012.     DX = 4456h ('DV')
  1013.     ES:DI -> FAR subroutine to be called on ???
  1014. Return: DS = segment of DESQview data structure for video buffer
  1015. Note: this function is probably meant for internal use only, due to the magic
  1016.       value required in DX
  1017.       the subroutine seems to be called when the DESQview menu is accessed;
  1018.     on entry, AL = 3 or 4
  1019. --------------------------------------------------
  1020. INT 10 - VIDEO (DESQview) - GET ???
  1021.     AH = 81h
  1022.     DX = 4456h ('DV')
  1023. Return: ES = segment of DESQview data structure for video buffer
  1024.         BYTE ES:[0] = current window number in DV 2.0x
  1025. Note: this function is probably meant for internal use only, due to the magic
  1026.       value required in DX
  1027. --------------------------------------------------
  1028. INT 10 - VIDEO (DESQview) - GET CURRENT WINDOW INFO
  1029.     AH = 82h
  1030.     DX = 4456h ('DV')
  1031. Return: DS = segment in DESQview for data structure
  1032.          in DV 2.00,
  1033.           BYTE DS:[0] = window number
  1034.           WORD DS:[1] = segment of other data structure
  1035.           WORD DS:[3] = segment of window's object handle
  1036.     ES = segment of DESQview data structure for video buffer
  1037.     AL = current window number
  1038.     AH = ???
  1039.     BL = direct screen writes
  1040.         0 program does not do direct writes
  1041.         1 program does direct writes, so shadow buffer not usable
  1042.     BH = ???
  1043.     CL = current video mode
  1044.     CH = ???
  1045. Note: this function is probably meant for internal use only, due to the magic
  1046.       value required in DX
  1047. --------------------------------------------------
  1048. INT 10 - VIDEO - Compaq Portable Extensions
  1049.     AH = BFh
  1050.     AL = subfunction
  1051.         00h select external monitor
  1052.         all registers preserved and the internal monitor is blanked
  1053.         and the external monitor is now the active monitor
  1054.         01h select internal monitor
  1055.         all registers preserved and the external monitor is blanked
  1056.         and the internal monitor is now the active monitor
  1057.         02h set master mode of the currently active video controller
  1058.         BH = 04h CGA
  1059.         BH = 05h EGA
  1060.         BH = 07h MDA
  1061.         03h get environment
  1062.         BX = 0000
  1063.         Return: BH = active monitor
  1064.                 00h = External
  1065.                 01h = Internal
  1066.             BL = master mode
  1067.                 00h = switchable VDU not present
  1068.                 04h = CGA
  1069.                 05h = EGA
  1070.                 07h = MDA
  1071.             CH = 00h (reserved)
  1072.             CL = switchable VDU mode supported
  1073.                 bit  0   = CGA supported
  1074.                 bits 1,2 = reserved (1)
  1075.                 bit  3   = MDA supported
  1076.                 bits 4-7 = reserved (1)
  1077.             DH = internal monitor type
  1078.                 00h = none
  1079.                 01h = Dual-mode monitor
  1080.                 02h = 5153 RGB monitor
  1081.                 03h = Compaq Color monitor
  1082.                 04h = 640x400 flat panel
  1083.             DL = external monitor type
  1084.                 00h = none
  1085.                 01h = Dual-mode monitor
  1086.                 02h = 5153 RGB monitor
  1087.                 03h = Compaq Color monitor
  1088.                 04h = 640x400 flat panel
  1089.         04h set mode switch delay
  1090.         BH = switch
  1091.             00h = enable delay
  1092.             01h = disable delay
  1093. --------------------------------------------------
  1094. INT 10 - Microsoft Mouse driver EGA support - READ ONE REGISTER
  1095.     AH = F0h
  1096.     BL = register number
  1097.     DX = group index
  1098.         Pointer/data chips
  1099.            00h CRT Controller (25 reg) 3B4h mono modes, 3D4h color modes
  1100.            08h Sequencer (5 registers) 3C4h
  1101.            10h Graphics Controller (9 registers) 3CEh
  1102.            18h Attribute Controller (20 registers) 3C0h
  1103.         Single registers
  1104.            20h Miscellaneous Output register 3C2h
  1105.            28h Feature Control register (3BAh mono modes, 3DAh color modes)
  1106.            30h Graphics 1 Position register 3CCh
  1107.            38h Graphics 2 Position register 3CAh
  1108. Return: BL = data
  1109. --------------------------------------------------
  1110. INT 10 - Microsoft Mouse driver EGA support - WRITE ONE REGISTER
  1111.     AH = F1h
  1112.     DX = group index (see function F0h)
  1113.     BL = register number
  1114.     BH = value to write
  1115. Return: BL = data
  1116. --------------------------------------------------
  1117. INT 10 - Microsoft Mouse driver EGA support - READ REGISTER RANGE
  1118.     AH = F2h
  1119.     CH = starting register number
  1120.     CL = Number of registers (>1)
  1121.     DX = group index
  1122.          00h CRTC (3B4h mono modes, 3D4h color modes)
  1123.          08h Sequencer 3C4h
  1124.          10h Graphics Controller 3CEh
  1125.          18h Attribute Controller 3C0h
  1126.     ES:BX -> buffer, CL bytes
  1127. --------------------------------------------------
  1128. INT 10 - Microsoft Mouse driver EGA support - WRITE REGISTER RANGE
  1129.     AH = F3h
  1130.     CH = starting register
  1131.     CL = number of registers (>1)
  1132.     DX = group index
  1133.          00h CRTC (3B4h mono modes, 3D4h color modes)
  1134.          08h Sequencer 3C4h
  1135.          10h Graphics Controller 3CEh
  1136.          18h Attribute Controller 3C0h
  1137.     ES:BX -> buffer, CL bytes
  1138. --------------------------------------------------
  1139. INT 10 - Microsoft Mouse driver EGA support - READ REGISTER SET
  1140.     AH = F4h
  1141.     CX = number of registers (>1)
  1142.     ES:BX -> table of records in this format:
  1143.          bytes 1-2 group index
  1144.         Pointer/data chips
  1145.            00h CRTC (3B4h mono modes, 3D4h color modes)
  1146.            08h Sequencer 3C4h
  1147.            10h Graphics Controller 3CEh
  1148.            18h Attribute Controller 3C0h
  1149.         Single registers
  1150.            20h Miscellaneous Output register 3C2h
  1151.            28h Feature Control register (3BAh mono modes, 3DAh color)
  1152.            30h Graphics 1 Position register 3CCh
  1153.            38h Graphics 2 Position register 3CAh
  1154.          byte 3 register number (0 for single registers)
  1155.          byte 4 register value
  1156. --------------------------------------------------
  1157. INT 10 - Microsoft Mouse driver EGA support - READ REGISTER SET
  1158.     AH = F5h
  1159.     CX = number of registers (>1)
  1160.     ES:BX -> table of records in this format:
  1161.          bytes 1-2 port number
  1162.         Pointer/data chips
  1163.            00h CRTC (3B4h mono modes, 3D4h color modes)
  1164.            08h Sequencer 3C4h
  1165.            10h Graphics Controller 3CEh
  1166.            18h Attribute Controller 3C0h
  1167.         Single registers
  1168.            20h Miscellaneous Output register 3C2h
  1169.            28h Feature Control register (3BAh mono modes, 3DAh color)
  1170.            30h Graphics 1 Position register 3CCh
  1171.            38h Graphics 2 Position register 3CAh
  1172.          byte 3 register number (0 for single registers)
  1173.          byte 4 register value
  1174. -------------------------------------------------
  1175. INT 10 - Microsoft Mouse driver EGA support - REVERT TO DEFAULT REGISTERS
  1176.     AH = F6h
  1177. -------------------------------------------------
  1178. INT 10 - Microsoft Mouse driver EGA support - DEFINE DEFAULT REGISTER TABLE
  1179.     AH = F7h
  1180.     DX = port number
  1181.        Pointer/data chips
  1182.           00h CRTC (3B4h mono modes, 3D4h color modes)
  1183.           08h Sequencer 3C4h
  1184.           10h Graphics Controller 3CEh
  1185.           18h Attribute Controller 3C0h
  1186.        Single registers
  1187.           20h Miscellaneous Output register 3C2h
  1188.           28h Feature Control register (3BAh mono modes, 3DAh color modes)
  1189.           30h Graphics 1 Position register 3CCh
  1190.           38h Graphics 2 Position register 3CAh
  1191.     ES:BX address of table of one byte entries, one byte
  1192.           to be written to each register
  1193. -------------------------------------------------
  1194. INT 10 - Microsoft Mouse driver EGA support - INTERROGATE DRIVER
  1195.     AH = FAh
  1196.     BX = 0
  1197. Return: BX = 0 if mouse driver not present
  1198.     ES:BX -> EGA Register Interface version number, if present:
  1199.         byte 1 = major release number
  1200.         byte 2 = minor release number
  1201. -------------------------------------------------
  1202. INT 10 - VIDEO (TopView) - GET VIDEO BUFFER
  1203.     AH = FEh
  1204.     ES:DI = segment:offset of assumed video buffer
  1205. Return: ES:DI = segment:offset of actual video buffer
  1206. --------------------------------------------------
  1207. INT 10 - VIDEO (TopView) - UPDATE REAL SCREEN FROM VIDEO BUFFER
  1208.     AH = FFh
  1209.     CX = number of sequential characters that have been modified
  1210.     DI = offset of first character that has been modified
  1211.     ES = segment of video buffer
  1212. Note: avoid CX=0
  1213. --------------------------------------------------
  1214. INT 11 - EQUIPMENT DETERMINATION
  1215. Return: AX = equipment flag bits
  1216.         0      diskette installed
  1217.         1      8087 present
  1218.         2      mouse installed (PS2 only)
  1219.         2,3   number of 16K banks of RAM on motherboard (PC only)
  1220.           number of 64K banks of RAM on motherboard (XT only)
  1221.           always = 11 on AT and above
  1222.         4,5   initial video mode
  1223.           01 = 40x25 color
  1224.           10 = 80x25 color
  1225.           11 = 80X25 IBM monochrome
  1226.         6,7   number of diskette drives (only if bit 0 = 1)
  1227.           00 = 1, 01 = 2, 10 = 3, 11 = 4
  1228.         8      0 = dma present, 1 = no dma on system (PCjr???)
  1229.         9-11  number of RS232 cards
  1230.         12      game I/O attached
  1231.         13      serial printer installed (PCjr)
  1232.           internal modem installed (PC/Convertible)
  1233.         14,15 number of printers
  1234. --------------------------------------------------
  1235. INT 12 - MEMORY SIZE
  1236. Return: AX = number of contiguous 1K blocks of memory
  1237. --------------------------------------------------
  1238. INT 13 - DISK - RESET DISK SYSTEM
  1239.     AH = 00h
  1240.     DL = drive (if bit 7 is set both hard disks and floppy disks reset)
  1241. --------------------------------------------------
  1242. INT 13 - DISK - STATUS OF DISK SYSTEM
  1243.     AH = 01h
  1244.     DL = drive (hard disk if bit 7 set)
  1245. Return: AL = status
  1246.         00h = successful completion
  1247.         01h = bad command
  1248.         02h = address mark not found
  1249.         03h = write attempted on write-protected disk
  1250.         04h = sector not found
  1251.         05h = reset failed (hard disk)
  1252.         06h = diskette changed
  1253.         07h = parameter act. failed (hard disk)
  1254.         08h = DMA overrun (floppy disk)
  1255.         09h = DMA across 64K boundary
  1256.         0Ah = bad sector detected (hard disk)
  1257.         0Bh = bad track detected (hard disk)
  1258.         0Ch = unsupported track
  1259.         0Dh = invalid number of sectors on format (hard disk)
  1260.         0Eh = control data address mark detected (hard disk)
  1261.         0Fh = DMA arbitration error (hard disk)
  1262.         10h = bad CRC/ECC
  1263.         11h = data ECC corrected (hard disk)
  1264.         20h = controller failure
  1265.         40h = seek failed
  1266.         80h = time out
  1267.         AAh = drive not ready (hard disk)
  1268.         BBh = undefined error (hard disk)
  1269.         CCh = write fault (hard disk)
  1270.         E0h = status register error (hard disk)
  1271.         FFh = sense operation failed (hard disk)
  1272. --------------------------------------------------
  1273. INT 13 - DISK - READ SECTORS INTO MEMORY
  1274.     AH = 02h
  1275.     AL = number of sectors to read
  1276.     CH = track (for hard disk, bits 8,9 in high bits of CL)
  1277.     CL = sector
  1278.     DH = head
  1279.     DL = drive
  1280.     ES:BX = address of buffer to fill
  1281. Return: CF set on error
  1282.     AH = status (see AH=1 above)
  1283.     AL = number of sectors read
  1284. --------------------------------------------------
  1285. INT 13 - DISK - WRITE SECTORS FROM MEMORY
  1286.     AH = 03h
  1287.     AL = number of sectors to write
  1288.     CH = track (if hard disk, bits 8,9 in high bits of CL)
  1289.     CL = sector (if hard disk, high two bits are high bits of track #)
  1290.     DH = head
  1291.     DL = drive
  1292.     ES:BX = address of buffer
  1293. Return: CF set on error
  1294.     AH = status (see AH=1 above)
  1295.     AL = number of sectors written
  1296. --------------------------------------------------
  1297. INT 13 - DISK - VERIFY SECTORS
  1298.     AH = 04h
  1299.     AL = number of sectors to verify
  1300.     CH = track (for hard disk, bits 8,9 in high bits of CL)
  1301.     CL = sector
  1302.     DH = head
  1303.     DL = drive
  1304. Return: CF set on error
  1305.     AH = status (see AH=1 above)
  1306.     AL = number of sectors verified
  1307. --------------------------------------------------
  1308. INT 13 - FLOPPY - FORMAT TRACK
  1309.     AH = 05h
  1310.     AL = number of sectors to create on this track
  1311.     CH = track
  1312.     CL = sector
  1313.     DH = head
  1314.     DL = drive
  1315.     ES:BX -> array of 4-byte address fields
  1316.            byte 1 = track
  1317.            byte 2 = head
  1318.            byte 3 = sector
  1319.            byte 4 = bytes/sector  0=128, 1=256, 2=512, 3=1024
  1320. Return: CF set if error occurred
  1321.     AH = status code (see AH=1 above)
  1322. --------------------------------------------------
  1323. INT 13 - FIXED DISK - FORMAT TRACK
  1324.     AH = 05h
  1325.     AL = interleave value (XT only)
  1326.     ES:BX = 512-byte format buffer
  1327.         the first 2*(sectors/track) bytes contain F,N for each sector
  1328.            F = 00 for good sector, 80h for bad sector
  1329.            N = sector number
  1330.     CH = cylinder number (bits 8,9 in high bits of CL)
  1331.     CL = sector number
  1332.     DH = head
  1333.     DL = drive
  1334. Return: AH = status code (see AH=1 above)
  1335. --------------------------------------------------
  1336. INT 13 - FIXED DISK - FORMAT TRACK AND SET BAD SECTOR FLAGS (XT,PORT)
  1337.     AH = 06h
  1338.     AL = interleave value
  1339.     CH = cylinder number (bits 8,9 in high bits of CL)
  1340.     CL = sector number
  1341.     DH = head
  1342.     DL = drive
  1343. Return: AH = status code (see AH=1 above)
  1344. --------------------------------------------------
  1345. INT 13 - FIXED DISK - FORMAT DRIVE STARTING AT GIVEN TRACK (XT,PORT)
  1346.     AH = 07h
  1347.     AL = interleave value (XT only)
  1348.     ES:BX = 512-byte format buffer, see AH=6 above
  1349.     CH = cylinder number (bits 8,9 in high bits of CL)
  1350.     CL = sector number
  1351.     DH = head
  1352.     DL = drive
  1353. Return: AH = status code (see AH=1 above)
  1354. --------------------------------------------------
  1355. INT 13 - DISK - GET CURRENT DRIVE PARAMETERS (XT,AT,XT286,CONV,PS)
  1356.     AH = 08h
  1357.     DL = drive number
  1358. Return: CF set on error
  1359.     AH = status code (see AH=1 above)
  1360.     BL = drive type (see AH=17h below) (AT/PS2 floppies only)
  1361.     DL = number of consecutive acknowledging drives
  1362.     DH = maximum value for head number
  1363.     CL = maximum value fo sector number
  1364.     CH = maximum value for cylinder number
  1365.     ES:DI = drive parameter table
  1366. --------------------------------------------------
  1367. INT 13 - FIXED DISK - INITIALIZE TWO FIXED DISK BASE TABLES (XT,AT,XT286,PS)
  1368.     AH = 09h
  1369. Return: CF set on error
  1370.     AH = status code (see AH=1 above)
  1371.     INT 41h points to table for drive 0
  1372.     INT 46h points to table for drive 1
  1373. --------------------------------------------------
  1374. INT 13 - FIXED DISK - READ LONG (XT,AT,XT286,PS)
  1375.     AH = 0Ah
  1376.     DL = drive ID
  1377.     DH = head
  1378.     CH = cylinder (bits 8,9 in high bits of CL)
  1379.     CL = sector
  1380.     ES:BX -> buffer to fill
  1381. Return: CF set on error
  1382.     AH = status code (see AH=1 above)
  1383.     AL = number of sectors read
  1384. Note: used for diagnostics only on PS/2 systems
  1385. --------------------------------------------------
  1386. INT 13 - FIXED DISK - WRITE LONG (XT,AT,XT286,PS)
  1387.     AH = 0Bh
  1388.     DL = drive ID
  1389.     DH = head
  1390.     CH = cylinder (bits 8,9 in high bits of CL)
  1391.     CL = sector
  1392.     ES:BX -> buffer containing data
  1393. Return: CF set on error
  1394.     AH = status code (see AH=1 above)
  1395.     AL = number of sectors written
  1396. Note: used for diagnostics only on PS/2 systems
  1397. --------------------------------------------------
  1398. INT 13 - FIXED DISK - SEEK TO CYLINDER (XT,AT,XT286,PS)
  1399.     AH = 0Ch
  1400.     DL = drive ID
  1401.     DH = head
  1402.     CH = cylinder (bits 8,9 in high bits of CL)
  1403. Return: CF set on error
  1404.     AH = status code (see AH=1 above)
  1405. --------------------------------------------------
  1406. INT 13 - FIXED DISK - ALTERNATE DISK RESET (XT,AT,XT286,PS)
  1407.     AH = 0Dh
  1408.     DL = drive ID
  1409. Return: CF set on error
  1410.     AH = status code (see AH=1 above)
  1411. --------------------------------------------------
  1412. INT 13 - FIXED DISK - READ SECTOR BUFFER (XT,PS)
  1413.     AH = 0Eh
  1414.     ES:BX -> buffer
  1415. Return: CF set on error
  1416.     AH = status code (see AH=1 above)
  1417. Notes: transfers controller's sector buffer.  No data is read from the drive
  1418.        used for diagnostics only on PS/2 systems
  1419. --------------------------------------------------
  1420. INT 13 - FIXED DISK - WRITE SECTOR BUFFER (XT,PS)
  1421.     AH = 0Fh
  1422.     ES:BX -> buffer
  1423. Return: CF set on error
  1424.     AH = status code (see AH=1 above)
  1425. Notes:    should be called before formatting to initialize the controller's
  1426.     sector buffer.
  1427.     used for diagnostics only on PS/2 systems
  1428. --------------------------------------------------
  1429. INT 13 - FIXED DISK - TEST FOR DRIVE READY (XT,AT,XT286,PS)
  1430.     AH = 10h
  1431.     DL = drive ID
  1432. Return: CF set on error
  1433.     AH = status code (see AH=1 above)
  1434. --------------------------------------------------
  1435. INT 13 - FIXED DISK - RECALIBRATE DRIVE (XT,AT,XT286,PS)
  1436.     AH = 11h
  1437.     DL = drive ID
  1438. Return: CF set on error
  1439.     AH = status code (see AH=1 above)
  1440. --------------------------------------------------
  1441. INT 13 - FIXED DISK - CONTROLER RAM DIAGNOSTIC (XT,PS)
  1442.     AH = 12h
  1443. Return: CF set on error
  1444.     AH = status code (see AH=1 above)
  1445. Note: used for diagnostics only on PS/2 systems
  1446. --------------------------------------------------
  1447. INT 13 - FIXED DISK - DRIVE DIAGNOSTIC (XT,PS)
  1448.     AH = 13h
  1449. Return: CF set on error
  1450.     AH = status code (see AH=1 above)
  1451. Note: used for diagnostics only on PS/2 systems
  1452. --------------------------------------------------
  1453. INT 13 - FIXED DISK - CONTROLLER DIAGNOSTICS (XT,AT,XT286,PS)
  1454.     AH = 14h
  1455. Return: CF set on error
  1456.     AH = status code (see AH=1 above)
  1457. Note: used for diagnostics only on PS/2 systems
  1458. --------------------------------------------------
  1459. INT 13 - DISK - GET TYPE (AT,XT2,XT286,CONV,PS)
  1460.     AH = 15h
  1461.     DL = drive ID
  1462. Return: CF set on error
  1463.     AH = disk type
  1464.         0 = disk not there
  1465.         1 = floppy, no change detection present
  1466.         2 = floppy with change detection
  1467.         3 = fixed disk
  1468.            CX:DX = number of 512-byte sectors
  1469. --------------------------------------------------
  1470. INT 13 - FLOPPY DISK - CHANGE OF DISK STATUS (AT,XT2,XT286,CONV,PS)
  1471.     AH = 16h
  1472.     DL = drive to check
  1473. Return: AH = disk change status
  1474.         0 = no disk change
  1475.         6 = disk changed
  1476. --------------------------------------------------
  1477. INT 13 - DISK - SET TYPE (AT,XT2,XT286,CONV,PS)
  1478.     AH = 17h
  1479.     AL = disk type
  1480.         00h = no disk
  1481.         01h = regular disk in regular drive
  1482.         02h = regular disk in high-capacity drive
  1483.         03h = high-capacity disk in high-capacity drive
  1484.         04h = 720K disk in 720K drive
  1485.     DL = drive ID
  1486. --------------------------------------------------
  1487. INT 13 - DISK - SET MEDIA TYPE FOR FORMAT (AT model 3x9,XT2,XT286,PS)
  1488.     AH = 18h
  1489.     DL = drive number
  1490.     CH = lower 8 bits of number of tracks
  1491.     CL = sectors per track (bits 0-5)
  1492.          top 2 bits of number of tracks (bits 6,7)
  1493. Return: AH = 00h  requested combination supported
  1494.          01h  function not available
  1495.          0Ch  not supported or drive type unknown
  1496.          80h  there is no disk in the drive
  1497.     ES:DI -> 11-byte parameter table
  1498. --------------------------------------------------
  1499. INT 13 - FIXED DISK - PARK HEADS (XT286,PS)
  1500.     AH = 19h
  1501.     DL = drive
  1502. Return: CF set on error
  1503.     AH = status (see AH=1 above)
  1504. --------------------------------------------------
  1505. INT 13 - ESDI FIXED DISK - FORMAT UNIT (PS)
  1506.     AH = 1Ah
  1507.     AL = defect table count
  1508.     CL = format modifiers
  1509.         bit 0: ignore primary defect map
  1510.         bit 1: ignore secondary defect map
  1511.         bit 2: update secondary defect map
  1512.         bit 3: perform surface analysis
  1513.         bit 4: generate periodic interrupt
  1514.     DL = drive
  1515.     ES:BX -> defect table
  1516. Return: CF set on error
  1517.     AH = status (see AH=1 above)
  1518. Note:    if periodic interrupt selected, INT 15h/AH=0Fh is called after each
  1519.     cylinder is formatted
  1520. --------------------------------------------------
  1521. INT 14 - SERIAL I/O - INITIALIZE USART
  1522.     AH = 00h
  1523.     AL = initializing parameters
  1524.         7 - 6 - 5       4 - 3     2      1 - 0
  1525.         -BAUD RATE-    PARITY   STOP   WORD
  1526.                     BITS  LENGTH
  1527.         000  110 bd    00 none  0-1   10 - 7
  1528.         001  150 bd    01 odd   1-2   11 - 8
  1529.         010  300 bd    11 even
  1530.         011  600 bd
  1531.         100 1200 bd
  1532.         101 2400 bd
  1533.         110 4800 bd
  1534.         111 9600 bd (4800 on PCjr)
  1535.     DX = port number (0-3)
  1536. Return: AH = RS-232 status code bits
  1537.         0: data ready
  1538.         1: overrun error
  1539.         2: parity error
  1540.         3: framing error
  1541.         4: break detected
  1542.         5: transmission buffer register empty
  1543.         6: transmission shift register empty
  1544.         7: time out--if set, other bits invalid
  1545.     AL = modem status bits
  1546.         0: delta Clear-To-Send
  1547.         1: delta Data-Set-Ready
  1548.         2: trailing edge of ring detected
  1549.         3: change in receive line signal detected
  1550.         4: Clear-To-Send
  1551.         5: Data-Set-Ready
  1552.         6: ring detected
  1553.         7: receive line signal detected
  1554. --------------------------------------------------
  1555. INT 14 - FOSSIL (Fido/Opus/Seadog Standard Interface Level) - INITIALIZE
  1556.     AH = 00h
  1557.     AL = initializing parameters
  1558.         7 - 6 - 5       4 - 3     2      1 - 0
  1559.         -BAUD RATE-    PARITY   STOP   WORD
  1560.                     BITS  LENGTH
  1561.         000 19200 bd   00 none  0-1   10 - 7
  1562.         001 38400 bd   01 odd   1-2   11 - 8
  1563.         010   300 bd   11 even
  1564.         011   600 bd
  1565.         100  1200 bd
  1566.         101  2400 bd
  1567.         110  4800 bd
  1568.         111  9600 bd (4800 on PCjr)
  1569.     DX = port number (0-3)
  1570. Return: AH = RS-232 status code bits
  1571.         0: RDA - input data is available in buffer
  1572.         1: OVRN - data has been lost
  1573.         5: THRE - room is available in output buffer
  1574.         6: TSRE - output buffer empty
  1575.     AL = modem status bits
  1576.         3: always 1
  1577.         7: DCD - carrier detect
  1578. --------------------------------------------------
  1579. INT 14 - SERIAL I/O - TRANSMIT CHARACTER
  1580.     AH = 01h
  1581.     AL = character
  1582.     DX = port number (0-3)
  1583. Return: AX = port status (see AH = 00h above)
  1584. --------------------------------------------------
  1585. INT 14 - SERIAL I/O - RECEIVE CHARACTER
  1586.     AH = 02h
  1587.     DX = port number (0-3)
  1588. Return: AL = character received
  1589.     AH = RS-232 status code (see AH = 00h above)
  1590. --------------------------------------------------
  1591. INT 14 - FOSSIL - RECEIVE CHARACTER WITH WAIT
  1592.     AH = 02h
  1593.     DX = port number (0-3)
  1594. Return: AL = character received
  1595.     AH = 00h
  1596. --------------------------------------------------
  1597. INT 14 - SERIAL I/O - GET USART STATUS
  1598.     AH = 03h
  1599.     DX = port number (0-3)
  1600. Return: AX = port status code (see AH = 00h above)
  1601. --------------------------------------------------
  1602. INT 14 - SERIAL I/O - EXTENDED INITIALIZE (CONVERTIBLE,PS)
  1603.     AH = 04h
  1604.     AL = break status
  1605.         0 if break
  1606.         1 if no break
  1607.     BH = parity
  1608.         0 no parity
  1609.         1 odd parity
  1610.         2 even parity
  1611.         3 stick parity odd
  1612.         4 stick parity even
  1613.     BL = number of stop bits
  1614.         0: one stop bit
  1615.         1: two stop bits (1.5 if 5 bit word length)
  1616.     CH = word length
  1617.         0: 5 bits
  1618.         1: 6 bits
  1619.         2: 7 bits
  1620.         3: 8 bits
  1621.     CL = baud rate
  1622.         0: 110
  1623.         1: 150
  1624.         2: 300
  1625.         3: 600
  1626.         4: 1200
  1627.         5: 2400
  1628.         6: 4800
  1629.         7: 9600
  1630.         8: 19200
  1631.     DX = port number
  1632. Return: AX = port status code (see AH = 00h above)
  1633. --------------------------------------------------
  1634. INT 14 - FOSSIL - INITIALIZE DRIVER
  1635.     AH = 04h
  1636.     DX = port number
  1637.     optionally BX=4F50h
  1638.            ES:CX = address of byte to be set upon ^C
  1639. Return: AX = 1954h (if successful)
  1640.     BL = maximum function number supported (excluding 7Eh and above)
  1641.     BH = revision of FOSSIL supported
  1642.     DTR is raised
  1643. --------------------------------------------------
  1644. INT 14 - SERIAL I/O - EXTENDED COMMUNICATION PORT CONTROL (CONVERTIBLE,PS)
  1645.     AH = 05h
  1646.     AL = 0 read modem control register
  1647.           Return: BL = modem control register (see below)
  1648.               AH = status
  1649.     AL = 1 write modem control register
  1650.           BL = modem control register
  1651.           bit 0: data terminal ready
  1652.           bit 1: request to send
  1653.           bit 2: OUT1
  1654.           bit 3: OUT2
  1655.           bit 4: LOOP
  1656.           bits 5-7 reserved
  1657.           Return: AX = status
  1658.     DX = port number
  1659. --------------------------------------------------
  1660. INT 14 - FOSSIL - DEINITIALIZE DRIVER
  1661.     AH = 05h
  1662.     DX = port number
  1663. Return: none
  1664.     DTR is not affected
  1665. --------------------------------------------------
  1666. INT 14 - FOSSIL - RAISE/LOWER DTR
  1667.     AH = 06h
  1668.     DX = port
  1669.     AL = DTR state to be set
  1670.         00h = lower
  1671.         01h = raise
  1672. --------------------------------------------------
  1673. INT 14 - FOSSIL - RETURN TIMER TICK PARAMETERS
  1674.     AH = 07h
  1675. Return: AL = timer tick interrupt number
  1676.     AH = ticks per second on interrupt number in AL
  1677.     DX = approximate number of milliseconds per tick
  1678. --------------------------------------------------
  1679. INT 14 - FOSSIL - FLUSH OUTPUT BUFFER WAITING TILL ALL OUTPUT IS DONE
  1680.     AH = 08h
  1681.     DX = port number
  1682. --------------------------------------------------
  1683. INT 14 - FOSSIL - PURGE OUTPUT BUFFER THROWING AWAY ALL PENDING OUTPUT
  1684.     AH = 09h
  1685.     DX = port number
  1686. --------------------------------------------------
  1687. INT 14 - FOSSIL - PURGE INTPUT BUFFER THROWING AWAY ALL PENDING INPUT
  1688.     AH = 0Ah
  1689.     DX = port number
  1690. --------------------------------------------------
  1691. INT 14 - FOSSIL - TRANSMIT NO WAIT
  1692.     AH = 0Bh
  1693.     AL = character
  1694.     DX = port number
  1695. Return: AX = 0000h character not accepted
  1696.        = 0001h character accepted
  1697. --------------------------------------------------
  1698. INT 14 - FOSSIL - NON-DESTRUCTIVE READ AHEAD
  1699.     AH = 0Ch
  1700.     DX = port number
  1701. Return: AX = FFFFh character not available
  1702.     AX = 00xxh character xx available
  1703. --------------------------------------------------
  1704. INT 14 - FOSSIL - KEYBOARD READ WITHOUT WAIT
  1705.     AH = 0Dh
  1706. Return: AX = FFFFh character not available
  1707.        = xxyyh standard IBM-style scan code
  1708. --------------------------------------------------
  1709. INT 14 - FOSSIL - KEYBOARD READ WITH WAIT
  1710.     AH = 0Eh
  1711. Return: AX = xxyyh standard IBM-style scan code
  1712. --------------------------------------------------
  1713. INT 14 - FOSSIL - ENABLE/DISABLE FLOW CONTROL
  1714.     AH = 0Fh
  1715.     AL = bit mask describing flow control requested
  1716.         0: xon/xoff on transmit (watch for xoff while sending)
  1717.         1: CTS/RTS (CTS on transmit/RTS on receive)
  1718.         2: reserved
  1719.         3: xon/xoff on receive (send xoff when buffer near full)
  1720.         4-7: all 1
  1721.     DX = port number
  1722. --------------------------------------------------
  1723. INT 14 - FOSSIL - EXTENDED ^C/^K CHECKING AND TRANSMIT ON/OFF
  1724.     AH = 10h
  1725.     AL = bit mask
  1726.         0: enable/disable ^C/^K checking
  1727.         1: enable/disable the transmitter
  1728.     DX = port number
  1729. --------------------------------------------------
  1730. INT 14 - FOSSIL - SET CURRENT CURSOR LOCATION
  1731.     AH = 11h
  1732.     DH = row
  1733.     DL = column
  1734. Note: this is the same as INT 10/AH=02h
  1735. --------------------------------------------------
  1736. INT 14 - FOSSIL - READ CURRENT CURSOR LOCATION
  1737.     AH = 12h
  1738. Return: DH = row
  1739.     DL = column
  1740. Note: this is the same as INT 10/AH=03h
  1741. --------------------------------------------------
  1742. INT 14 - FOSSIL - SINGLE CHARACTER ANSI WRITE TO SCREEN
  1743.     AH = 13h
  1744.     AL = character
  1745. --------------------------------------------------
  1746. INT 14 - FOSSIL - ENABLE OR DISABLE WATCHDOG PROCESSING
  1747.     AH = 14h
  1748.     AL = 01h enable watchdog
  1749.          00h disable watchdog
  1750.     DX = port number
  1751. --------------------------------------------------
  1752. INT 14 - FOSSIL - WRITE CHARACTER TO SCREEN USING BIOS SUPPORT ROUTINES
  1753.     AH = 15h
  1754.     AL = character
  1755. --------------------------------------------------
  1756. INT 14 - FOSSIL - INSERT/DELETE FUNCTION FROM TIMER TICK CHAIN
  1757.     AH = 16h
  1758.     AL = function
  1759.         00h = delete
  1760.         01h = add
  1761.     ES:DX -> routine to call
  1762. Return: AX = 0000h successful
  1763.          0001h unsuccessful
  1764. --------------------------------------------------
  1765. INT 14 - FOSSIL - REBOOT SYSTEM
  1766.     AH = 17h
  1767.     AL = method
  1768.         00h = cold boot
  1769.         01h = warm boot
  1770. --------------------------------------------------
  1771. INT 14 - FOSSIL - READ BLOCK
  1772.     AH = 18h
  1773.     CX = maximum number of characters to transfer
  1774.     DX = port number
  1775.     ES:DI -> user buffer
  1776. Return: AX = number of characters transfered
  1777. --------------------------------------------------
  1778. INT 14 - FOSSIL - WRITE BLOCK
  1779.     AH = 19h
  1780.     CX = maximum number of characters to transfer
  1781.     DX = port number
  1782.     ES:DI -> user buffer
  1783. Return: AX = number of characters transfered
  1784. --------------------------------------------------
  1785. INT 14 - FOSSIL - BREAK BEGIN OR END
  1786.     AH = 1Ah
  1787.     AL = 00h stop sending 'break'
  1788.          01h start sending 'break'
  1789.     DX = port number
  1790. --------------------------------------------------
  1791. INT 14 - FOSSIL - RETURN INFORMATION ABOUT THE DRIVER
  1792.     AH = 1Bh
  1793.     DX = port number
  1794.     CX = size of user buffer
  1795.     ES:DI -> user buffer
  1796. Return: AX = number of characters transferred
  1797. Structure =
  1798.     WORD    size of structure in bytes
  1799.     BYTE    FOSSIL spec driver conforms to
  1800.     BYTE    revision level of this specific driver
  1801.     DWORD    pointer to ASCII id string
  1802.     WORD    size of the input buffer
  1803.     WORD    number of bytes left in buffer
  1804.     WORD    size of the output buffer
  1805.     WORD    number of bytes left in buffer
  1806.     BYTE    width of screen
  1807.     BYTE    length of screen
  1808.     BYTE    actual baud rate, computer to modem
  1809. --------------------------------------------------
  1810. INT 14 - FOSSIL - INSTALL AN EXTERNAL APPLICATION FUNCTION
  1811.     AH = 7Eh
  1812.     AL = code assigned to external application
  1813.     ES:DX -> entry point
  1814. Return: AX = 1954h
  1815.     BL = code assigned to application (same as input AL)
  1816.     DH = 00h failed
  1817.          01h successful
  1818. --------------------------------------------------
  1819. INT 14 - FOSSIL - REMOVE AN EXTERNAL APPLICATION FUNCTION
  1820.     AH = 7Fh
  1821.     AL = code assigned to external application
  1822.     ES:DX -> entry point
  1823. Return: AX = 1954h
  1824.     BL = code assigned to application (same as input AL)
  1825.     DH = 00h failed
  1826.          01h successful
  1827. --------------------------------------------------
  1828. INT 15 - CASSETTE - TURN ON MOTOR (PC,Jr)
  1829.     AH = 00h
  1830. Return: CF set on error, AH = 86h if no cassette present
  1831. --------------------------------------------------
  1832. INT 15 - CASSETTE - TURN OFF MOTOR (PC,Jr)
  1833.     AH = 01h
  1834. Return: CF set on error, AH = 86h if no cassette present
  1835. --------------------------------------------------
  1836. INT 15 - CASSETTE - READ DATA BLOCKS (PC,Jr)
  1837.     AH = 02h
  1838.     CX = count of bytes
  1839.     ES:BX -> data area
  1840. Return: CF set on error
  1841.     AH = status
  1842.         01h CRC error
  1843.         02h bad tape signals
  1844.         04h no data
  1845.         80h invalid command
  1846.         86h no cassette present
  1847.     DX = count of bytes read
  1848.     ES:BX = pointer past last byte read
  1849. --------------------------------------------------
  1850. INT 15 - CASSETTE - WRITE DATA BLOCKS (PC,Jr)
  1851.     AH = 03h
  1852.     CX = count of bytes to write
  1853.     ES:BX -> data area
  1854. Return: CF set on error
  1855.        AH = status (see above)
  1856.     ES:BX = pointer past last byte written
  1857.     CX = 0
  1858. --------------------------------------------------
  1859. Int 15 - SYSTEM - FORMAT UNIT PERIODIC INTERRUPT (PS ESDI drives only)
  1860.     AH = 0Fh
  1861.     AL = phase code
  1862.         00h reserved
  1863.         01h surface analysis
  1864.         02h formatting
  1865. Return: CF clear if formatting should continue, set if it should terminate
  1866. Note: called during ESDI drive formatting after each cylinder is completed
  1867. --------------------------------------------------
  1868. INT 15 - TopView - "PAUSE" - GIVE UP CPU TIME
  1869.     AX = 1000h
  1870. Return: after other processes run
  1871. --------------------------------------------------
  1872. INT 15 - TopView - "GETMEM" - ALLOCATE "SYSTEM" MEMORY
  1873.     AX = 1001h
  1874.     BX = number of bytes to allocate
  1875. Return: ES:DI -> block of memory
  1876. --------------------------------------------------
  1877. INT 15 - TopView - "PUTMEM" - DEALLOCATE "SYSTEM" MEMORY
  1878.     AX = 1002h
  1879.     ES:DI -> previously allocated block
  1880. Return: block freed
  1881. --------------------------------------------------
  1882. INT 15 - TopView - "PRINTC" - DISPLAY CHARACTER/ATTRIBUTE ON SCREEN
  1883.     AX = 1003h
  1884.     BH = attribute
  1885.     BL = character
  1886.     DX = segment of object handle for window
  1887. Note: BX=0 does not display anything, it only positions the hardware cursor
  1888. --------------------------------------------------
  1889. INT 15 - TopView - UNIMPLEMENTED IN DV 2.0x
  1890.     AH = 10h
  1891.     AL = 04h thru 12h
  1892. Return: pops up "Programming error" window in DV 2.0x
  1893. --------------------------------------------------
  1894. INT 15 - TopView - "GETBIT" - DEFINE A 2ND-LEVEL INTERRUPT HANDLER
  1895.     AX = 1013h
  1896.     ES:DI -> FAR service routine
  1897. Return: BX = bit mask indicating which bit was allocated
  1898.          0 if no more bits available
  1899. --------------------------------------------------
  1900. INT 15 - TopView - "FREEBIT" - UNDEFINE A 2ND-LEVEL INTERRUPT HANDLER
  1901.     AX = 1014h
  1902.     BX = bit mask from INT 15/AX=1013h
  1903. --------------------------------------------------
  1904. INT 15 - TopView - "SETBIT" - SCHEDULE ONE OR MORE 2ND-LEVEL INTERRUPTS
  1905.     AX = 1015h
  1906.     BX = bit mask for interrupts to post
  1907. Return: indicated routines will be called at next ???
  1908. --------------------------------------------------
  1909. INT 15 - TopView - "ISOBJ" - VERIFY OBJECT HANDLE
  1910.     AX = 1016h
  1911.     ES:DI = possible object handle
  1912. Return: BX = -1 if ES:DI is a valid object handle
  1913.           0 if ES:DI is not
  1914. --------------------------------------------------
  1915. INT 15 - TopView - UNIMPLEMENTED IN DV 2.00
  1916.     AX = 1017h
  1917. Return: pops up "Programming error" window in DV 2.00
  1918. --------------------------------------------------
  1919. INT 15 - TopView - "LOCATE" - FIND WINDOW AT A GIVEN SCREEN LOCATION
  1920.     AX = 1018h
  1921.     BH = column
  1922.     BL = row
  1923.     ES = segment of object handle for ???
  1924.          (0 = use default)
  1925. Return: ES = segment of object handle for window which is visible at the
  1926.          indicated position
  1927. --------------------------------------------------
  1928. INT 15 - TopView - "SOUND" - MAKE TONE
  1929.     AX = 1019h
  1930.     BX = frequency in Hertz
  1931.     CX = duration in clock ticks (18.2 ticks/sec)
  1932. Return: immediately, tone continues to completion
  1933. Notes: if another tone is already playing, the new tone does not start until
  1934.        completion of the previous one.    In DV 2.00, it is possible to enqueue
  1935.        about 32 tones before the process is blocked until a note completes.
  1936.        in DV 2.00, the lowest tone allowed is 20 Hz
  1937. --------------------------------------------------
  1938. INT 15 - TopView - "OSTACK" - SWITCH TO TASK'S INTERNAL STACK
  1939.     AX = 101Ah
  1940. Return: stack switched
  1941. --------------------------------------------------
  1942. INT 15 - TopView - "BEGINC" - BEGIN CRITICAL REGION
  1943.     AX = 101Bh
  1944. Return: task-switching temporarily disabled
  1945. Note: will not task-switch until END CRITICAL REGION (AX = 101Ch) called
  1946. --------------------------------------------------
  1947. INT 15 - TopView - "ENDC" - END CRITICAL REGION
  1948.     AX = 101Ch
  1949. Return: task-switching enabled
  1950. --------------------------------------------------
  1951. INT 15 - TopView - "STOP" - STOP TASK
  1952.     AX = 101Dh
  1953.     ES = segment of object handle for task to be stopped
  1954.          (== handle of main window for that task)
  1955. Return: indicated task will no longer get CPU time
  1956. Note: at least in DV 2.00, this function is ignored unless the indicated task
  1957.       is the current task.
  1958. --------------------------------------------------
  1959. INT 15 - TopView - "START" - START TASK
  1960.     AX = 101Eh
  1961.     ES = segment of object handle for task to be started
  1962.          (== handle of main window for that task)
  1963. Return: indicated task is started up again
  1964. --------------------------------------------------
  1965. INT 15 - TopView - "DISPEROR" - POP-UP ERROR WINDOW
  1966.     AX = 101Fh
  1967.     BX = bit fields
  1968.          bits 0-12: number of characters to display
  1969.          bits 13,14: which mouse button may be pressed to remove window
  1970.              00 = either
  1971.              01 = left
  1972.              10 = right
  1973.              11 = either
  1974.          bit 15: beep if 1
  1975.     DS:DI -> text of message
  1976.     CH = width of error window (0 = default)
  1977.     CL = height of error window (0 = default)
  1978.     DX = segment of object handle
  1979. Return: BX = status: 1 = left button, 2 = right, 27 = ESC pressed
  1980. Note: window remains on-screen until ESC or indicated mouse button is pressed
  1981. --------------------------------------------------
  1982. INT 15 - TopView - UNIMPLEMENTED IN DV 2.0x
  1983.     AX = 1020h
  1984. Return: pops up "Programming error" window in DV 2.0x
  1985. --------------------------------------------------
  1986. INT 15 - TopView - "PGMINT" - INTERRUPT ANOTHER TASK
  1987.     AX = 1021h
  1988.     BX = segment of object handle for task to interrupt
  1989.     DX:CX = address of FAR routine to jump to next time task is run
  1990. Return: nothing???
  1991. Note: the current ES, DS, SI, DI, and BP are passed to the FAR routine
  1992. --------------------------------------------------
  1993. INT 15 - TopView - "GETVER" - GET VERSION
  1994.     AX = 1022h
  1995.     BX = 0
  1996. Return: BX nonzero, TopView or compatible loaded
  1997.     (BL = major version, BH = minor version)
  1998. Notes: TaskView returns BX = 0001h, DESQview 2.0 returns BX = 0A01h
  1999. --------------------------------------------------
  2000. INT 15 - TopView - "POSWIN" - POSITION WINDOW
  2001.     AX = 1023h
  2002.     BX = segment of object handle for parent window within which to
  2003.          position the window (0 = full screen)
  2004.     ES = segment of object handle for window to be positioned
  2005.     DL = bit flags
  2006.          bits 0,1: horizontal position
  2007.         00 = current
  2008.         01 = center
  2009.         10 = left
  2010.         11 = right
  2011.          bits 2,3: vertical position
  2012.         00 = current
  2013.         01 = center
  2014.         10 = top
  2015.         11 = bottom
  2016.          bit 4: don't redraw screen if set
  2017.          bits 5-7 not used
  2018.     CH = number of columns to offset from position specified by DL
  2019.     CL = number of rows to offset from position specified by DL
  2020. Return: nothing
  2021. --------------------------------------------------
  2022. INT 15 - TopView - "GETBUF" - GET VIRTUAL SCREEN INFO
  2023.     AX = 1024h
  2024.     BX = segment of object handle for window
  2025.           (0 = use default)
  2026. Return: ES:DI = address of virtual screen
  2027.     CX = size of virtual screen in bytes
  2028.     DL = 0 ???
  2029.          1 ???
  2030. --------------------------------------------------
  2031. INT 15 - TopView - "USTACK" - SWITCH BACK TO USER'S STACK
  2032.     AX = 1025h
  2033. Return: stack switched back
  2034. Note: call only after INT 15h/AX=101Ah
  2035. --------------------------------------------------
  2036. INT 15 - DESQview (TopView???) - UNIMPLEMENTED IN DV 2.0x
  2037.     AH = 10h
  2038.     AL = 26h thru 2Ah
  2039. Return: pops up "Programming error" window in DV 2.0x
  2040. --------------------------------------------------
  2041. INT 15 - DESQview 2.0 (TopView???) - "POSTTASK" - AWAKEN TASK
  2042.     AX = 102Bh
  2043.     BX = segment of object handle for task
  2044. Return: nothing
  2045. --------------------------------------------------
  2046. INT 15 - DESQview 2.0 (TopView???) - START NEW APPLICATION IN NEW PROCESS
  2047.     AX = 102Ch
  2048.     ES:DI -> contents of .PIF/.DVP file
  2049.     BX = size of .PIF/.DVP info
  2050. Return: BX = segment of object handle for new task
  2051.          0 on error
  2052. --------------------------------------------------
  2053. INT 15 - DESQview 2.0 - KEYBOARD MOUSE CONTROL
  2054.     AX = 102Dh
  2055.     BL = subfunction
  2056.          00h determine whether using keyboard mouse
  2057.          01h turn keyboard mouse on
  2058.          02h turn keyboard mouse off
  2059. Return: if BL was 00h,
  2060.        BL = 0 using real mouse
  2061.         1 using keyboard mouse
  2062. --------------------------------------------------
  2063. INT 15 - TopView commands
  2064.     AH = 11h
  2065.     AL = various
  2066. Note: in DESQview 2.0x, these function calls are identical to AH=DEh, so
  2067.       see those below
  2068. --------------------------------------------------
  2069. INT 15 - TopView - SEND MESSAGE - "HANDLE" - RETURN OBJECT HANDLE
  2070.     AH = 12h
  2071.     BH = 00h
  2072.     BL = which handle to return
  2073.         00h handle in DWORD on top of stack
  2074.         01h current task's window handle
  2075.         02h given task's mailbox handle (task's handle on stack)
  2076.         03h current task's mailbox handle
  2077.         04h given task's keyboard handle (task's handle on stack)
  2078.         05h current task's keyboard object handle
  2079.         06h given task's OBJECTQ handle (task's handle on stack)
  2080.         07h current task's OBJECTQ handle
  2081.         08h   \
  2082.           thru > return 0000:0000
  2083.         10h   /
  2084. Return: DWORD on top of stack is object handle
  2085. --------------------------------------------------
  2086. INT 15 - TopView - SEND MESSAGE - "NEW" - CREATE NEW OBJECT
  2087.     AH = 12h
  2088.     BH = 01h
  2089.     BL = object
  2090.         00h handle is DWORD on top of stack
  2091.         01h use task's window handle
  2092.         02h given task's mailbox (task's handle on top of stack)
  2093.         03h current task's mailbox
  2094.         04h given task's keyboard (task's handle on top of stack)
  2095.         05h current task's keyboard object
  2096.         08h WINDOW class
  2097.         09h MAILBOX class
  2098.         0Ah KEYBOARD class
  2099.         0Bh TIMER object (counts down 32-bit time in 10ms increments)
  2100.         0Fh POINTER object
  2101.         10h PANEL object
  2102.     STACK: (if window object or WINDOW class)
  2103.            DWORD address to jump to (no new task if high word == 0)
  2104.            DWORD ??? (doesn't seem to be used)
  2105.            DWORD bytes for task's private stack (-1 == default of 0100h)
  2106.            DWORD bytes system memory allocation (0 == none, -1 == default)
  2107.            DWORD window size, columns
  2108.            DWORD window size, rows
  2109.            DWORD length of window title
  2110.            DWORD address of window title
  2111. Return: DWORD on top of stack is new object handle
  2112. Note: if a new task is created, it is started with
  2113.       AX = BX = CX = SI = DI = BP = 0
  2114.       DX = segment of parent's object handle
  2115.       DS = ES = SS = segment of private stack (and new task's object handle)
  2116. --------------------------------------------------
  2117. INT 15 - TopView - SEND MESSAGE - "FREE" - FREE AN OBJECT
  2118.     AH = 12h
  2119.     BH = 02h
  2120.     BL = object
  2121.         00h handle in DWORD on top of stack
  2122.         window: close window and free
  2123.         timer: free timer
  2124.         panel: free panel object
  2125.         pointer: free pointer
  2126.         01h task's window handle - kills task, never returns
  2127.         02h given task's mailbox (task's handle on top of stack)
  2128.         03h current task's mailbox
  2129.         04h given task's keyboard (task's handle on top of stack)
  2130.         05h current task's keyboard object
  2131. --------------------------------------------------
  2132. INT 15 - TopView - SEND MESSAGE - "DIR" - GET PANEL FILE DIRECTORY
  2133.     AH = 12h
  2134.     BX = 0300h
  2135.     STACK: DWORD handle of panel object
  2136. Return: STACK: DWORD length of directory
  2137.            DWORD address of directory
  2138.  
  2139. Format of panel file:
  2140.     BYTE C0h C3h
  2141.     BYTE number of panels in file
  2142.     for each panel in file
  2143.         8 BYTES blank-padded panel name
  2144.         DWORD panel offset in file
  2145.         WORD panel length
  2146.     data for panels (each panel consists of one or more
  2147.         window/query/manager streams)
  2148.         first byte of each panel must be 1Bh, fifth byte must be E5h
  2149. --------------------------------------------------
  2150. INT 15 - TopView - SEND MESSAGE - "ADDR" - GET OBJECT HANDLE
  2151.     AH = 12h
  2152.     BH = 03h
  2153.     BL = object
  2154.         00h handle in DWORD on top of stack
  2155.         02h sender of last msg read from mailbox (task's handle on stack)
  2156.         03h sender of last msg read from current task's mailbox
  2157. Return: DWORD on stack is handle
  2158. --------------------------------------------------
  2159. INT 15 - TopView - SEND MESSAGE - "READ" - WAIT FOR TIMER TO EXPIRE
  2160.     AH = 12h
  2161.     BX = 0400h
  2162.     STACK: DWORD timer's handle
  2163. Return: STACK: DWORD time in 1/100 sec since midnight when timer expires
  2164. --------------------------------------------------
  2165. INT 15 - TopView - SEND MESSAGE - "READ" - GET NEXT RECORD
  2166.     AH = 12h
  2167.     BH = 04h
  2168.     BL = object
  2169.         00h handle is DWORD on top of stack
  2170.         window: read next logical line
  2171.         mailbox: wait for and get next message
  2172.         pointer: wait for and get next message
  2173.         01h read the next logical line from task's default window
  2174.         02h get next message from mailbox (task's handle on top of stack)
  2175.         03h get next message from current task's mailbox
  2176.         04h get the next input from keyboard (handle on top of stack)
  2177.         05h get the next input from task's default keyboard
  2178.         06h wait for input from any object in OBJECTQ (handle on stack)
  2179.         07h wait for input from any object in task's default OBJECTQ
  2180. Return: STACK: (if objectq) DWORD handle of object with input
  2181.            (otherwise)  DWORD number of bytes
  2182.                 DWORD address
  2183. --------------------------------------------------
  2184. INT 15 - TopView - SEND MESSAGE - "APPLY" - WRITE PANEL TO WINDOW
  2185.     AH = 12h
  2186.     BX = 0400h
  2187.     STACK: DWORD handle of panel object
  2188.            DWORD window's handle or 0
  2189.            DWORD length of panel name
  2190.            DWORD pointer to panel name
  2191. Return: STACK: DWORD handle of created keyboard or 0
  2192.            DWORD handle of window which was used
  2193. Notes: status of APPLY may be checked with STATUS message
  2194.        panel MUST have the following format
  2195.      first byte must be 1Bh (i.e. must start with a stream)
  2196.      first opcode in stream must be E5h
  2197.        single byte arg of opcode is interpreted thus:
  2198.           bit 7  \    11 means new window created
  2199.           bit 6  /    01 means existing window used
  2200.           bit 5 if set, create a new keyboard and put in field mode
  2201.           bit 4 if set and bit 5 set, make new keyboard active
  2202. -------------------------------------------------
  2203. INT 15 - TopView - SEND MESSAGE - "WRITE" - WRITE TO OBJECT
  2204.     AH = 12h
  2205.     BH = 05h
  2206.     BL = object
  2207.         00h handle is DWORD on top of stack
  2208.         timer: start timer to end at a specified time
  2209.         pointer: move pointer icon to specified position
  2210.         02h send message by value/status=0 to mbox (task's handle on stack)
  2211.         03h send message by value/status=0 to current task's mailbox
  2212.         04h add input buffer to KEYBOARD queue (handle on top of stack)
  2213.         05h add input buffer to task's default KEYBOARD queue
  2214.         06h add an object to OBJECTQ (handle on top of stack)
  2215.         07h add an object to task's default OBJECTQ
  2216.     STACK: (if mailbox)  DWORD length
  2217.                  DWORD address
  2218.            (if keyboard) DWORD status (such as scan code)
  2219.                  DWORD length
  2220.                  DWORD address
  2221.            (if objectq)  DWORD handle of object to add
  2222.            (if timer)    DWORD 1/100ths seconds since midnight (actually
  2223.                    only accurate to 1/18 sec)
  2224.            (if pointer)  DWORD column relative to origin of window
  2225.                  DWORD row relative to origin of window
  2226. --------------------------------------------------
  2227. INT 15 - TopView - SEND MESSAGE - "WRITE" - WRITE STRING TO WINDOW
  2228.     AH = 12h
  2229.     BH = 05h
  2230.     BL = object
  2231.         00h DWORD on top of stack is window handle
  2232.         01h write string to task's default window
  2233.     STACK: DWORD object handle if handle passed on stack
  2234.            DWORD total length of string (high word == 0)
  2235.            DWORD address of string to display
  2236. Note: service routine will pop stack
  2237. Return: indicated actions performed
  2238.     a. non-control characters are displayed
  2239.     b. CR/LF/BS/Tab cause the usual cursor movement
  2240.     c. ESC starts a data structure with additional commands
  2241.  
  2242. Data Structure:
  2243.     MAGIC  DB  1Bh
  2244.     MODE   DB  ?   ; 00h, 01h, 10h, 14h-1Fh legal
  2245.     LENGTH DW  ?   ; length of remainder in bytes
  2246.     var-length fields follow, each an OPCODE followed by
  2247.          zero or more args
  2248.  
  2249. MODE 00h (set or display values) "WINDOW STREAM"
  2250.     Opcodes:args
  2251.     00h  display 20h blanks with the default attribute
  2252.     01h-1Fh display OPCODE blanks with the default attribute
  2253.     20h  display char with default attribute 20h times
  2254.          BYTE char to repeat
  2255.     21h-3Fh display char with default attribute OPCODE-20h times
  2256.          BYTE char to repeat
  2257.     40h  display 20h blanks with specified attribute
  2258.          BYTE attribute of blanks
  2259.     41h-5Fh display OPCODE-40h blanks with specified attribute
  2260.          BYTE attribute of blanks
  2261.     60h  display next 20h characters
  2262.          20h BYTES characters to display
  2263.     61h-7Fh display next OPCODE-60h characters
  2264.          N BYTES characters to display
  2265.     80h-87h  display N blanks with default attribute
  2266.          BYTE low 8 bits of 11-bit count (high 3 in low 3 bits of OPCODE)
  2267.               [000h means 800h]
  2268.     88h-8Fh display N copies of the character
  2269.          BYTE low 8 bits of 11-bit count (high 3 in low 3 bits of OPCODE)
  2270.               [000h means 800h]
  2271.          BYTE character to repeat
  2272.     90h-97h  display N blanks with specified attribute
  2273.          BYTE low 8 bits of 11-bit length (high 3 in low 3 bits of OPCODE)
  2274.               [000h means 800h]
  2275.          BYTE attribute
  2276.     98h-9FH  display string at logical cursor pos
  2277.          BYTE low 8 bits of 11-bit length (high 3 in low 3 bits of OPCODE)
  2278.               [000h means 800h]
  2279.          N BYTES string to display
  2280.     A0h  set logical cursor row
  2281.          BYTE row number (0 is top)
  2282.     A1h  set logical cursor column
  2283.          BYTE column number (0 is leftmost)
  2284.     A2h  set top edge of scrolling region
  2285.          BYTE row
  2286.     A3h  set left edge of scrolling region
  2287.          BYTE column
  2288.     A4h  set row of physical window position
  2289.          BYTE line
  2290.     A5h  set column of physical window position
  2291.          BYTE column
  2292.     A6h  set height of physical window
  2293.          BYTE #rows
  2294.     A7h  set width of physical window
  2295.          BYTE #columns
  2296.     A8h  set viewport row
  2297.          BYTE row
  2298.     A9h  set viewport column
  2299.          BYTE column
  2300.     AAh  set virtual screen height
  2301.          BYTE rows
  2302.     ABh  set virtual screen width
  2303.          BYTE columns
  2304.     ACh-AEh  unused
  2305.     AFh  ???
  2306.          BYTE ??? (ANDed with current value of something)
  2307.     B0h  move logical cursor down
  2308.          BYTE #rows (signed, negative values move up)
  2309.     B1h  move logical cursor right
  2310.          BYTE #cols (signed, negative values move left)
  2311.     B2h  shift top edge of scrolling region
  2312.          BYTE #rows (signed)
  2313.     B3h  shift left edge of scrolling region
  2314.          BYTE #cols (signed)
  2315.     B4h  shift window down
  2316.          BYTE #lines (signed)
  2317.     B5h  shift window right
  2318.          BYTE #columns (signed)
  2319.     B6h  expand physical window vertically
  2320.          BYTE #lines (signed)
  2321.     B7h  expand physical window horizontally
  2322.          BYTE #columns (signed)
  2323.     B8h  adjust viewport row
  2324.          BYTE #rows (signed)
  2325.     B9h  adjust viewport column
  2326.          BYTE #columns (signed)
  2327.     BAh  adjust virtual screen height
  2328.          BYTE #rows to increase (signed)
  2329.     BBh  adjust virtual screen width
  2330.          BYTE #cols to increase (signed)
  2331.     BCh-BFh  unused
  2332.     C0h  set logical cursor position
  2333.          BYTE row number (0 is top border)
  2334.          BYTE column number (0 is left border)
  2335.     C1h  set top left corner of scrolling region
  2336.          BYTE row
  2337.          BYTE column
  2338.     C2h  set window pos
  2339.          BYTE upper left row (no top border if 0)
  2340.          BYTE upper left column (no left border if 0)
  2341.     C3h  set current window size
  2342.          BYTE #rows
  2343.          BYTE #cols
  2344.     C4h  set upper left corner of viewport (portion of virtual screen
  2345.          displayed in window)
  2346.          BYTE row
  2347.          BYTE column
  2348.     C5h  set size of virtual screen
  2349.          BYTE #rows
  2350.          BYTE #cols
  2351.     C6h  unused
  2352.     C7h  unused
  2353.     C8h  set logical cursor relative to current position
  2354.          BYTE number of rows to move down (signed)
  2355.          BYTE number of columns to move right (signed)
  2356.     C9h  shift top left corner of scrolling region
  2357.          BYTE #rows (signed)
  2358.          BYTE #cols (signed)
  2359.     CAh  set window pos relative to current position
  2360.          BYTE number of rows to shift down (signed)
  2361.          BYTE number of columns to shift right (signed)
  2362.     CBh  set window size relative to current size
  2363.          BYTE number of rows to expand (signed)
  2364.          BYTE number of cols to expand (signed)
  2365.     CCh  shift viewport relative to current position
  2366.          BYTE rows to shift (signed)
  2367.          BYTE cols to shift (signed)
  2368.     CDh  resize virtual screen
  2369.          BYTE #rows to expand (signed)
  2370.          BYTE #cols to expand (signed)
  2371.     CEh  clear ???
  2372.     CFh  set ???
  2373.     D0h  turn on ??? (default)
  2374.     D1h  turn off ???
  2375.     D2h  turn on ???
  2376.     D3h  turn off ??? (default)
  2377.     D4h  window is visible
  2378.     D5h  window is hidden
  2379.     D6h  window has frame
  2380.     D7h  window unframed
  2381.     D8h  read characters from window (default)
  2382.     D9h  read attributes from window
  2383.     DAh  use logical attributes, which may be remapped
  2384.         attributes
  2385.            1 normal text
  2386.            2 highlighted normal text
  2387.            3 help text
  2388.            4 highlighted help text
  2389.            5 error message
  2390.            6 highlighted error message
  2391.            7 emphasized text
  2392.            8 marked text
  2393.            9-16 are reverse video versions of 1-8
  2394.     DBh  use physical attributes for characters
  2395.     DCh  enable special actions for control characters (default)
  2396.     DDh  disable special control char handling, all chars displayable by
  2397.          BIOS TTY call
  2398.     DEh  write both character and attribute (default)
  2399.     DFh  write character only, leave attribute untouched
  2400.     E0h  repeat following commands
  2401.          BYTE number of times
  2402.     E1h  end of commands to repeat, start repeating them
  2403.     E2h  set color
  2404.          BYTE color
  2405.     E3h  clear virtual screen
  2406.     E4h  redraw window
  2407.     E5h  select menu style
  2408.          BYTE style
  2409.         bits 5,4 = 01 use two-letter menu entries for remainder of
  2410.           this stream
  2411.     E5h  (panel file only)
  2412.          BYTE modifier
  2413.         bits 7,6 = 11 panel goes in new window
  2414.              = 01 panel uses existing window
  2415.         bit 5 = 1 create new keyboard in field mode
  2416.         bit 4 = 1 make newly-created keyboard active
  2417.         bits 3-0 unused ???
  2418.     E6h  create new window and perform rest of manipulations in new window
  2419.          BYTE number of rows
  2420.          BYTE number of columns
  2421.          Return: DWORD object handle returned on stack at end
  2422.     E7h  unused
  2423.     E8h  scroll area up (top left corner defined by opcode C1h)
  2424.          BYTE height
  2425.          BYTE width
  2426.     E9h  scroll area down (top left corner defined by opcode C1h)
  2427.          BYTE height
  2428.          BYTE width
  2429.     EAh  scroll area left (top left corner defined by opcode C1h)
  2430.          BYTE height
  2431.          BYTE width
  2432.     EBh  scroll area right (top left corner defined by opcode C1h)
  2433.          BYTE height
  2434.          BYTE width
  2435.     ECh  set logical attributes for window contents
  2436.          BYTE bit flags???
  2437.          BYTE which attributes to set
  2438.         bit 7  if set, copy single following byte to indicated attrs
  2439.         bits 4-6  # of first attribute to change - 1
  2440.         bits 0-3  # of consecutive attributes to change
  2441.          N BYTES new attributes
  2442.     EDh  set logical attributes for window frame
  2443.          BYTE bit flags???
  2444.          BYTE which attributes to set
  2445.         bit 7  if set, copy single following byte to indicated attrs
  2446.         bits 4-6  # of first attribute to change - 1
  2447.         bits 0-3  # of consecutive attributes to change
  2448.          N BYTES new attributes
  2449.           attributes
  2450.                1 = top left corner
  2451.                2 = top right corner
  2452.                3 = bottom left corner
  2453.                4 = bottom right corner
  2454.                5 = top edge
  2455.                6 = bottom edge
  2456.                7 = left edge
  2457.                8 = right edge
  2458.     EEh  set characters for window frame
  2459.          BYTE bit flags???
  2460.          BYTE which characters to set
  2461.         bit 7  if set, copy single following byte to indicated chars
  2462.         bits 4-6  # of first char to change - 1
  2463.         bits 0-3  # of consecutive chars to change
  2464.          N BYTES new chars (same relative position as attributes above)
  2465.     EFh  set window name
  2466.          BYTE length of name
  2467.          N BYTES name
  2468.     F0h  clear input field to blanks
  2469.          BYTE field number
  2470.     F1h  fill input field with character
  2471.          BYTE field number
  2472.          BYTE char
  2473.     F2h  set color of input field
  2474.          BYTE field number (1-N)
  2475.          BYTE attribute
  2476.     F3h  set initial contents of input field
  2477.          BYTE field number (1-N)
  2478.          N BYTES enough chars to exactly fill field as defined by op FFh
  2479.     F4h  position cursor to specific input field
  2480.          BYTE field number (1-N)
  2481.     F5h  change field table entry
  2482.          BYTE field number
  2483.          7-8 BYTEs field table entry (see FFh below)
  2484.     F6h  set field type
  2485.          BYTE field number
  2486.          BYTE type
  2487.     F7h  ???
  2488.          N BYTES (one for each field???)
  2489.     F8h  scroll field up a line
  2490.          BYTE field number
  2491.     F9h  scroll field down a line
  2492.          BYTE field number
  2493.     FAh  scroll field left
  2494.          BYTE field number
  2495.     FBh  scroll field right
  2496.          BYTE field number
  2497.     FCh  set field table header
  2498.          BYTE number of fields
  2499.          BYTE screen behavior bits
  2500.         bit 7  ???
  2501.         bit 6  set if menu items may be selected via keyboard
  2502.         bit 5  set if left mouse button may terminate entry
  2503.         bit 4  set if right mouse button may terminate entry
  2504.         bit 3  if set, menu fields return ' ' rather than 'Y' or 'N'
  2505.         bit 2  ???
  2506.         bits 0,1 = 00 no data returned on read of keyboard
  2507.                01 data returned as array of chars containing
  2508.                   all fields packed together, with menu fields
  2509.                   represented by the character 'Y' if selected
  2510.                   and 'N' if not selected
  2511.                10 data returned as variable-length records for
  2512.                   all fields
  2513.                11 data returned as variable-length records for
  2514.                   the fields which were modified
  2515.          BYTE field in which cursor was when entry was terminated
  2516.           (updated by DESQview)
  2517.          BYTE field in which mouse was when entry was terminated
  2518.           (updated by DESQview)
  2519.          BYTE color of field currently pointed to during entry
  2520.          BYTE color of input fields which have been selected
  2521.     FDh  reset modified bit for all fields
  2522.     FEh  reset selected and modified bits for all fields
  2523.     FFh  set up input fields
  2524.          6 BYTES table header (see FCh above)
  2525.          the field table entries, one for each field
  2526.          BYTE start row    \
  2527.          BYTE start column  \ if menu selection and start is to
  2528.          BYTE end row        / right or below end, select from kbd only
  2529.          BYTE end column   /
  2530.          BYTE field type
  2531.             bits 7,6 = 00 non-entry field
  2532.                    01 echos keystrokes input to make menu selection
  2533.                    10 fill-in field
  2534.                    11 menu selection
  2535.             bit 5  ???
  2536.             bit 4  ???
  2537.             bit 3  ???
  2538.             bit 2  ???
  2539.             bit 1  set if field selected
  2540.             bit 0  set if field modified
  2541.          BYTE modifier
  2542.               if type is fill-in, then bit flags to determine behavior
  2543.               bit 7  if set, beep when field is full
  2544.               bit 6  move to next field when current field is full
  2545.               bit 5  if set, enter text from right end (for numbers)
  2546.               bit 4  if set, force input to uppercase
  2547.               bit 3  if set, clear old contents on first keystroke
  2548.               bit 2  ???
  2549.               bit 1  ???
  2550.               bit 0  ???
  2551.               if type is menu selection, first key to press to activate
  2552.               00h if have to point-&-click or is an extended-ASCII
  2553.                   keystroke (only if two-key menus enabled)
  2554.          BYTE for menu item, color of field after cursor or mouse
  2555.               passes through it
  2556.          BYTE second key for activating menu selection if field type is
  2557.               C0h (0 = only single key).  This byte is present iff
  2558.               two-letter menu entries selected with opcode E5h, and
  2559.               in that case is present regardless of field type
  2560.          Note: DESQview uses and updates the actual copy of the information
  2561.            which is contained in the stream.  Thus this info must remain
  2562.            intact until after the data entry is complete.
  2563.  
  2564. MODE 01h "QUERY STREAM" (valid only for those opcodes listed here)
  2565.     A0h return logical cursor row in next byte
  2566.     A1h return logical cursor column in next byte
  2567.     A2h return top row of scrolling region in next byte
  2568.     A3h return left column of scrolling region in next byte
  2569.     A4h return row of physical window origin in next byte
  2570.     A5h return column of physical window origin in next byte
  2571.     A6h return height of physcial window in next byte
  2572.     A7h return width of physical window in next byte
  2573.     A8h return row of viewport origin in next byte
  2574.     A9h return column of viewport origin in next byte
  2575.     AAh return height of virtual screen in next byte
  2576.     ABh return width of virtual screen in next byte
  2577.     AFh return ??? in next byte
  2578.     C0h return current logical cursor position in next two bytes
  2579.     C1h return top left corner of scrolling region in next two bytes
  2580.     C2h return current window position in next two bytes
  2581.     C3h return current window size in next two bytes
  2582.     C4h return current viewport origin in next two bytes
  2583.     C5h return current virtual screen size in next two bytes
  2584.     D0h \ overwritten with D0h if ??? on
  2585.     D1h /               D1h if ??? off
  2586.     D2h \ overwritten with D2h if ??? on
  2587.     D3h /               D3h if ??? off
  2588.     D4h \ overwritten with D4h if window visible
  2589.     D5h /               D5h if window hidden
  2590.     D6h \ overwritten with D6h if window has frame
  2591.     D7h /               D7h if window unframed
  2592.     D8h \ overwritten with D8h if reading characters from window
  2593.     D9h /               D9h if reading attributes from window
  2594.     DAh \ overwritten with DAh if using logical attributes
  2595.     DBh /               DBh if using physical attributes
  2596.     DCh \ overwritten with DCh if TTY control char interpretation on
  2597.     DDh /               DDh if TTY control char interpretation off
  2598.     DEh \ overwritten with DEh if writing both characters and attributes
  2599.     DFh /               DFh if leaving attributes untouched
  2600.     E2h return current color in next byte
  2601.     ECh get logical attributes for window contents
  2602.         BYTE ???
  2603.         BYTE which attributes to get
  2604.         bit 7 ???
  2605.         bits 4-6 first attribute to get - 1
  2606.         bits 0-3 # consecutive attributes
  2607.         N BYTES buffer to hold attributes
  2608.     EDh get logical attributes for window frame
  2609.         BYTE ???
  2610.         BYTE which attributes to get
  2611.         bit 7 ???
  2612.         bits 4-6 first attribute to get - 1
  2613.         bits 0-3 # consecutive attributes
  2614.         N BYTES buffer to hold attributes
  2615.     EEh get characters for window frame
  2616.         BYTE ???
  2617.         BYTE which attributes to get
  2618.         bit 7 ???
  2619.         bits 4-6 first char to get - 1
  2620.         bits 0-3 # consecutive chars
  2621.         N BYTES buffer to hold chars
  2622.     EFh return current window name
  2623.         BYTE    max length of returned name
  2624.         N BYTES buffer to hold window name
  2625.     F3h return contents of input field
  2626.         BYTE field number
  2627.         N BYTES buffer to hold field contents (size exactly equal to field
  2628.             size)
  2629.     F5h get field table entry
  2630.         BYTE field number
  2631.         7-8 BYTES buffer to hold field table entry
  2632.     F6h get type of a field
  2633.         BYTE field number
  2634.         BYTE type
  2635.     FCh get field table header
  2636.         6 BYTES buffer to store header
  2637.  
  2638. MODE 10h "MANAGER STREAM" (valid only for opcodes listed here)
  2639.     00h allow window to be moved horizontally
  2640.     01h allow window to be moved vertically
  2641.     02h allow window to change width
  2642.     03h allow window to change height
  2643.     04h allow window to be scrolled horizontally
  2644.     05h allow window to be scrolled vertically
  2645.     06h allow "Close Window" menu selection
  2646.     07h allow window to be hidden
  2647.     08h allow "Mark" menu
  2648.     0Eh allow "Scissors" menu
  2649.     10h allow DESQview main menu to be popped up
  2650.     11h allow "Switch Windows" menu
  2651.     12h allow "Open Window" menu
  2652.     13h allow "Quit" menu selection
  2653.     20h-33h opposite of 00h-13h, disallow specified action
  2654.     40h notify if horizontal position of window changes
  2655.     41h notify if vertical position of window changes
  2656.     42h notify if width of window changes
  2657.     43h notify if height of window changes
  2658.     44h notify if window scrolled horizontally
  2659.     45h notify if window scrolled vertically
  2660.     46h notify if window is closed--program has to clean up and exit itself
  2661.     47h notify if window is hidden
  2662.     48h notify if "?" on main menu selected
  2663.     49h notify if colors changed??? (guess)
  2664.     4Ah notify if window is made active
  2665.     4Bh notify if window is switched away from
  2666.     4Ch notify if video mode changes
  2667.     4Dh notify if "Scissors" menu "Cut" option selected
  2668.     4Eh notify if "Scissors" menu "Copy" option selected
  2669.     4Fh notify if "Scissors" menu "Paste" option selected
  2670.     50h notify if DESQview main menu popped up
  2671.     51h notify if DESQview main menu popped down
  2672.     60h-71h  opposite of 40h-51h: don't notify on specified event
  2673.     84h attach window to parent task's window (both move together)
  2674.     85h detach window from parent task's window (may move independently)
  2675.     86h disable background operation
  2676.     87h enable running in background
  2677.     88h set minimum size of physical window
  2678.         BYTE rows
  2679.         BYTE columns
  2680.     89h set maximum size of physical window
  2681.         BYTE rows
  2682.         BYTE cols
  2683.     8Ah set primary asynchronous notification routine
  2684.         DWORD address of routine, 0000:0000 means none
  2685.           on entry ES:DI = handle of window, DS:SI is secondary routine
  2686.                mailbox contains message indicating event
  2687.                   Opcode
  2688.                    40h  horizontal movement
  2689.                    DWORD object handle of window
  2690.                    BYTE  new row
  2691.                    BYTE  new col
  2692.                    41h  vertical movement
  2693.                    DWORD object handle of window
  2694.                    BYTE  new row
  2695.                    BYTE  new col
  2696.                    42h  horizontal size change
  2697.                    DWORD object handle of window
  2698.                    BYTE  new rows
  2699.                    BYTE  new cols
  2700.                    43h  vertical size change
  2701.                    DWORD object handle of window
  2702.                    BYTE  new rows
  2703.                    BYTE  new cols
  2704.                    44h  scrolled horizontally
  2705.                    DWORD object handle of window
  2706.                    BYTE  upper left row visible
  2707.                    BYTE  upper left column visible
  2708.                    BYTE  ???
  2709.                    BYTE  amount moved: >0 right, <0 left, 0 done
  2710.                    45h  scrolled vertically
  2711.                    DWORD object hande of window
  2712.                    BYTE  upper left row visible
  2713.                    BYTE  upper left column visible
  2714.                    BYTE  ???
  2715.                    BYTE  amount moved: >0 down, <0 up, 0 done
  2716.                    46h  window closed
  2717.                    DWORD object handle of window
  2718.                    BYTE  mouse pointer row
  2719.                    BYTE  mouse pointer column
  2720.                    BYTE  ???
  2721.                    47h  window hidden
  2722.                    48h  Help for Program selected
  2723.                    DWORD object handle of window
  2724.                    BYTE mouse pointer row
  2725.                    BYTE mouse pointer column
  2726.                    BYTE ???
  2727.                    49h  colors changed??? (guess)
  2728.                    4Ah  switched to window from another ("raise")
  2729.                    4Bh  switched away from the window ("lower")
  2730.                    4Ch  video mode changed
  2731.                    BYTE new video mode
  2732.                    4Dh  Scissors/cUt selected
  2733.                    DWORD object handle of window
  2734.                    BYTE  row of upper left corner
  2735.                    BYTE  column of upper left corner
  2736.                    BYTE  ???
  2737.                    DWORD handle of mailbox to write???
  2738.                    BYTE  height of region
  2739.                    BYTE  width of region
  2740.                    4Eh  Scissors/Copy selected
  2741.                    DWORD object handle of window
  2742.                    BYTE  row of upper left corner
  2743.                    BYTE  column of upper left corner
  2744.                    BYTE  ???
  2745.                    DWORD handle of mailbox to write???
  2746.                    BYTE  height of region
  2747.                    BYTE  width of region
  2748.                    4Fh  Scissors/Paste selected
  2749.                    DWORD object handle of window
  2750.                    BYTE  row of upper left corner
  2751.                    BYTE  column of upper left corner
  2752.                    BYTE  ???
  2753.                    DWORD handle of mailbox to read
  2754.                    BYTE  height of region
  2755.                    BYTE  width of region
  2756.                    50h  main menu popped up
  2757.                    51h  main menu popped down
  2758.           routine should restore all registers before returning
  2759.     8Bh set secondary async notification routine
  2760.         DWORD address of routine, passed to primary routine in DS:SI,
  2761.           rather than called directly
  2762.     AEh ???
  2763.     AFh set selected field marker character
  2764.         BYTE character to display at left edge of selected fields
  2765.     BCh disable use of cursor pad for navigating menus, maybe other???
  2766.     BDh enable use of cursor pad for navigating menus, maybe other???
  2767.     BEh disable ???
  2768.     BFh enable ???
  2769.     C0h make current window topmost in system
  2770.     C1h force current process into foreground
  2771.     C2h make current window topmost in process
  2772.     C3h position mouse pointer relative to origin of current field
  2773.         BYTE rows below upper left corner of field
  2774.         BYTE columns to right of upper left corner of field
  2775.     C4h position mouse pointer relative to origin of given field
  2776.         BYTE field number
  2777.         BYTE rows below upper left corner of field
  2778.         BYTE columns to right of upper left corner of field
  2779.     C5h hide current window
  2780.     C6h show windows for this process
  2781.     C7h hide all windows for this process
  2782.     C8h suspend process and hide all its windows
  2783.     C9h force current process into background
  2784.     CAh make current window bottom-most in process
  2785.     CBh ???
  2786.     CCh close window
  2787.     CEh reorder windows
  2788.         DWORD pointer to null-terminated list of words
  2789.           each word is segment of object handle for a window
  2790.  
  2791. MODES 14h to 1Fh "USER STREAMS"
  2792.     normally NOPs, but may be defined by SETESC message to invoke FAR
  2793.     routines, one for each mode number
  2794.       on entry to handler,
  2795.         DS:SI = first byte of actual stream (not header)
  2796.         CX = #bytes in stream
  2797.         ES:DI = window's handle
  2798. --------------------------------------------------
  2799. INT 15 - TopView - SEND MESSAGE - "SIZEOF" - GET OBJECT SIZE
  2800.     AH = 12h
  2801.     BH = 08h
  2802.     BL = object
  2803.         00h handle in DWORD on top of stack
  2804.         timer: elapsed time since timer started
  2805.         pointer: number of messages queued to pointer object
  2806.         panel: number of panels in panel file
  2807.         01h total chars in current task's default window
  2808.         02h number of messages in task's mailbox (task's handle on stack)
  2809.         03h number of messages in current task's mailbox
  2810.         04h number of input buffers queued in task's kbd (handle on stack)
  2811.         05h number of input buffers queued for current task's default kbd
  2812.         06h number of objects queued in OBJECTQ (task's handle on stack)
  2813.         07h number of objects queued in current task's OBJECTQ
  2814. Return: DWORD on stack is result
  2815. --------------------------------------------------
  2816. INT 15 - TopView - SEND MESSAGE - "LEN" - GET OBJECT LENGTH
  2817.     AH = 12h
  2818.     BH = 09h
  2819.     BL = object
  2820.         00h handle in DWORD on top of stack
  2821.         window: chars/line
  2822.         timer: timer remaining before timer expires
  2823.         01h number of chars/line in current task's default window
  2824. Return: DWORD on top of stack is length
  2825. --------------------------------------------------
  2826. INT 15 - TopView - SEND MESSAGE - "ADDTO" - SET OBJECT BITS
  2827.     AH = 12h
  2828.     BH = 0Ah
  2829.     BL = object
  2830.         00h handle is DWORD on top of stack
  2831.         window: write characters and attributes
  2832.         timer: start timer for specified interval
  2833.         pointer: set control flags
  2834.         01h write characters and attributes to task's default window
  2835.         02h send message/status by value to mailbox (task's handle on stack)
  2836.         03h send message/status by value to current task's default mailbox
  2837.         04h set control flags on KEYBOARD object (handle on top of stack)
  2838.         05h set control flags on task's default KEYBOARD object
  2839.     STACK: (if mailbox) DWORD status
  2840.                 DWORD length of message
  2841.                 DWORD address
  2842.            (if timer)   DWORD duration in 1/100 seconds
  2843.            (if window)  DWORD count of characters
  2844.                 DWORD address of characters
  2845.                 DWORD count of attributes
  2846.                 DWORD address of attributes
  2847.            (otherwise)  DWORD bits to set
  2848. For keyboard objects, the bits have the following significance:
  2849.     bit 15 reserved, can't be set
  2850.     bit 14 unused
  2851.     bit 13 reserved, can't be set
  2852.     bit 12-5 unused
  2853.     bit 4  filter all keys (used with handler established by SETESC)
  2854.     bit 3  program continues executing while input in progress
  2855.     bit 2  insert mode active
  2856.     bit 1  keyboard is active
  2857.     bit 0  keyboard is in field mode
  2858. For pointer objects, the bits have the following significance:
  2859.     bit 15 reserved, can't be set
  2860.     bit 14-8 unused
  2861.     bit 7  mouse pointer is hidden while in window
  2862.     bit 6  get messages even if window not topmost
  2863.     bit 5  get messages even if window not foreground
  2864.     bit 4  mouse button must be held 1/2 second before it "clicks"
  2865.     bit 3  pointer position is relative to screen origin, not window origin
  2866.     bit 2  send message on button release as well as button press
  2867.     bit 1  unused???
  2868.     bit 0  send message only on button activity, not movement
  2869.            DV-specific, and INT 15h/AX=DE0Fh must have been called first
  2870. --------------------------------------------------
  2871. INT 15 - TopView - SEND MESSAGE - "SUBFROM" - RESET OBJECT BITS
  2872.     AH = 12h
  2873.     BH = 0Bh
  2874.     BL = object
  2875.         00h handle is DWORD on top of stack
  2876.         window: write attributes only
  2877.         mailbox: send message by reference
  2878.         pointer: reset control flags
  2879.         01h write attributes only to task's default window
  2880.         02h send msg/status by reference to mailbox (task's handle on stack)
  2881.         03h send msg/status by reference to current task's mailbox
  2882.         04h clear control flags on KEYBOARD object (handle on top of stack)
  2883.         05h clear control flags on task's default KEYBOARD object
  2884.         06h remove specific object from OBJECTQ (task's handle on stack)
  2885.         07h remove specific object from task's default OBJECTQ
  2886.     STACK: (if mailbox) DWORD status
  2887.                 DWORD length
  2888.                 DWORD address
  2889.            (if window)  DWORD number of attributes to write
  2890.                 DWORD address of attributes
  2891.            (if objectq) DWORD handle of object to remove
  2892.            (otherwise)  DWORD indicates which bits to clear
  2893. --------------------------------------------------
  2894. INT 15 - TopView - SEND MESSAGE - "OPEN" - OPEN OBJECT
  2895.     AH = 12h
  2896.     BH = 0Ch
  2897.     BL = object
  2898.         00h handle is DWORD on top of stack
  2899.         window: fill with given character
  2900.         keyboard: attach to a window
  2901.         timer: open
  2902.         pointer: start taking input for window
  2903.         panel: associate with a panel file
  2904.         01h fill task's default window with given character
  2905.         02h open given task's mailbox for input (task's handle on stack)
  2906.         03h open current task's mailbox
  2907.         04h attach a KEYBOARD to a window (handle on top of stack)
  2908.         05h attach task's default KEYBOARD to a window
  2909.         06h open a task's OBJECTQ (task's handle on top of stack)
  2910.         07h open current task's OBJECTQ
  2911.      STACK: (if window)   DWORD character to fill with
  2912.         (if keyboard) DWORD handle of window to attach to
  2913.         (if pointer)  DWORD handle of window to attach to
  2914.         (if panel)    DWORD length of filename
  2915.                   DWORD address of filename
  2916.         (otherwise)   nothing
  2917. Notes: special action taken if first byte of panel file name is 1Bh
  2918.        if first two bytes of panel file "name" are C0hC3h, then the "name" IS
  2919.        the panel file
  2920.        result code of open may be retrieved with STATUS message
  2921. --------------------------------------------------
  2922. INT 15 - TopView - SEND MESSAGE - "CLOSE" - CLOSE OBJECT
  2923.     AH = 12h
  2924.     BH = 0Dh
  2925.     BL = object
  2926.         00h handle is DWORD on top of stack
  2927.         timer: close
  2928.         keyboard: detach from window
  2929.         pointer: stop taking input
  2930.         panel: close
  2931.         02h close given task's mailbox (task's handle on top of stack)
  2932.         03h close task's default mailbox
  2933.         04h close KEYBOARD object (handle on top of stack)
  2934.         05h close task's default KEYBOARD
  2935.         06h close givent task's OBJECTQ (task's handle on top of stack)
  2936.         07h close current task's OBJECTQ
  2937. --------------------------------------------------
  2938. INT 15 - TopView - SEND MESSAGE - "ERASE" - ERASE OBJECT
  2939.     AH = 12h
  2940.     BH = 0Eh
  2941.     BL = object
  2942.         00h handle is DWORD on top of stack
  2943.         window: clear
  2944.         keyboard: discard input
  2945.         timer: cancel current interval
  2946.         pointer: discard all pending messages
  2947.         01h clear task's default window
  2948.         02h discard all queued messages in mailbox (handle on top of stack)
  2949.         03h discard all queued messages in current task's default mailbox
  2950.         04h discard all input queued to KEYBOARD (handle on top of stack)
  2951.         05h discard all input queued to task's default KEYBOARD
  2952.         06h remove all objects from OBJECTQ (task's handle on top of stack)
  2953.         07h remove all objects from current task's OBJECTQ
  2954. --------------------------------------------------
  2955. INT 15 - TopView - SEND MESSAGE - "STATUS" - GET OBJECT STATUS
  2956.     AH = 12h
  2957.     BH = 0Fh
  2958.     BL = object
  2959.         00h handle is DWORD on top of stack
  2960.         timer: is it running?
  2961.         pointer: return status of last message
  2962.         panel: verify success of last OPEN or APPLY
  2963.         02h return status of last msg READ from mailbox (handle on stack)
  2964.         03h return status of last msg READ from task's default mailbox
  2965.         04h get status of last msg from task's KEYBOARD (task handle on stk)
  2966.         05h get status of last msg from task's default KEYBOARD
  2967.         06h return whether OBJECTQ is open or not (handle on top of stack)
  2968.         07h return whether task's default OBJECTQ is open or not
  2969. Return: DWORD on top of stack is status
  2970. Note: if object is a panel object, the status indicates the error code:
  2971.     14h ???
  2972.     15h ???
  2973.     16h invalid panel format
  2974.     17h panel file already open
  2975.     95h ???
  2976.     98h null panel file name
  2977. --------------------------------------------------
  2978. INT 15 - TopView - SEND MESSAGE - "EOF" - GET OBJECT EOF STATUS
  2979.     AH = 12h
  2980.     BH = 10h
  2981.     BL = object
  2982.         00h handle is DWORD on top of stack
  2983.         01h returns TRUE if logical cursor past end of task's def window
  2984.         02h return ??? for task's mailbox (task's handle on top of stack)
  2985.         03h return ??? for current task's mailbox
  2986. Return: DWORD on top of stack is status
  2987. --------------------------------------------------
  2988. INT 15 - TopView - SEND MESSAGE - "AT" - POSITION OBJECT CURSOR
  2989.     AH = 12h
  2990.     BH = 11h
  2991.     BL = object
  2992.         00h window's handle is DWORD on top of stack
  2993.         01h position logical cursor on task's default window
  2994.     STACK: DWORD column
  2995.            DWORD row
  2996. --------------------------------------------------
  2997. INT 15 - TopView - SEND MESSAGE - "SETNAME" - ASSIGN NAME TO MAILBOX
  2998.     AH = 12h
  2999.     BH = 11h
  3000.     BL = mailbox to name
  3001.         00h DWORD on top of stack is mailbox handle
  3002.         02h use given task's mailbox (task's handle on top of stack)
  3003.         03h use current task's default mailbox
  3004.     STACK: DWORD length of name
  3005.            DWORD address of name
  3006. --------------------------------------------------
  3007. INT 15 - TopView - SEND MESSAGE - "SETSCALE" - SET POINTER SCALE FACTOR
  3008.     AH = 12h
  3009.     BX = 1100h
  3010.     STACK: DWORD object handle for pointer object
  3011.            DWORD number of colums to scale pointer position to
  3012.            DWORD number of rows to scale pointer position to
  3013. --------------------------------------------------
  3014. INT 15 - TopView - SEND MESSAGE - "READN" - GET NEXT N OBJECT BYTES
  3015.     AH = 12h
  3016.     BH = 12h
  3017.     BL = object
  3018.         00h handle is DWORD on top of stack
  3019.         01h read next N chars/attributes on task's default window
  3020.     STACK: DWORD count
  3021. Return: STACK: DWORD width of screen line
  3022.            DWORD address
  3023.            DWORD count actually read
  3024. --------------------------------------------------
  3025. INT 15 - TopView - SEND MESSAGE - "GETSCALE" - GET POINTER SCALE FACTOR
  3026.     AH = 12h
  3027.     BX = 1200h
  3028.     STACK: DWORD object handle for pointer
  3029. Return: STACK: DWORD pointer pos scaled as if window were this many colums wide
  3030.            DWORD pointer pos scaled as if window were this many rows high
  3031. --------------------------------------------------
  3032. INT 15 - TopView - SEND MESSAGE - "REDRAW" - REDRAW WINDOW
  3033.     AH = 12h
  3034.     BH = 13h
  3035.     BL = window object
  3036.         00h DWORD on top of stack is handle for window to redraw
  3037.         01h redraw task's default window
  3038. --------------------------------------------------
  3039. INT 15 - TopView - SEND MESSAGE - "SETICON" - SPECIFY POINTER ICON
  3040.     AH = 12h
  3041.     BX = 1300h
  3042.     STACK: DWORD object handle for pointer
  3043.            DWORD character to use for pointer
  3044. --------------------------------------------------
  3045. INT 15 - TopView - SEND MESSAGE - "SETESC" - SET ESCAPE ROUTINE ADDRESS
  3046.     AH = 12h
  3047.     BH = 14h
  3048.     BL = message modifier
  3049.         00h handle is DWORD on top of stack
  3050.         01h define user stream
  3051.         04h intercept keystrokes from KEYBOARD to a window (handle on stack)
  3052.         05h intercept keystrokes from task's default KEYBOARD to a window
  3053.     STACK: (if window)   DWORD user stream number (14h-1Fh)
  3054.                  DWORD address of FAR user stream handler
  3055.            (if keyboard) DWORD address of FAR filter function
  3056.  
  3057. The keyboard filter function is called when the keyboard is in field mode.  On
  3058. entry,
  3059.     AL = character
  3060.     AH = 0 or extended ASCII code if AL = 0
  3061.     BX = field number
  3062.     CH = cursor column
  3063.     CL = cursor row
  3064.     DL = field type modifier (sixth item in field table entry)
  3065.     DH = ??? (seventh item in field table entry)
  3066.     ES:SI = window's handle
  3067. (also, in DV 2.00, DS:DI points to the field table entry.  This may change in
  3068.  other versions)
  3069. The filter function should return
  3070.     AH = 0 use keystroke
  3071.          1 ignore keystroke
  3072.          >1 beep and ignore keystroke
  3073. --------------------------------------------------
  3074. INT 15 - TopView - SEND MESSAGE - "LOCK" - REQUEST EXCLUSIVE ACCESS TO RESOURCE
  3075.     AH = 12h
  3076.     BH = 14h
  3077.     BL = object
  3078.         00h mailbox handle is DWORD on top of stack
  3079.         02h use given task's mailbox (task's handle on top of stack)
  3080.         03h use current task's default mailbox
  3081. Note: release exclusive access by sending CLOSE message to mailbox
  3082.       access may be requested multiple times, and requires multiple CLOSEs
  3083. --------------------------------------------------
  3084. INT 15 - PRINT.COM - ??? (AT,XT286,PS50+)
  3085.     AH = 20h
  3086.     AL = subfunction
  3087.         00h ???
  3088.         01h ???
  3089.         10h setup of SYSREQ routine (OS hook)
  3090.         11h completion of SYSREQ function (OS hook)
  3091. Note: AL = 0,1 set or reset some flags which affect what PRINT does when it
  3092.       tries to access the disk
  3093. --------------------------------------------------
  3094. INT 15 - SYSTEM - POWER-ON SELF-TEST ERROR LOG (PS50+)
  3095.     AH = 21h
  3096.     AL = subfunction
  3097.         00h read POST log
  3098.         01h write POST log
  3099.         BH = device ID
  3100.         BL = error code
  3101. Return: CF set on error
  3102.     AH = status (00h OK, 01h list full, 80h invalid cmd, 86h unsupported)
  3103.     if function 00h:
  3104.        BX = number of error codes stored
  3105.        ES:DI -> error log
  3106. Note: the log is a series of words, the first byte of which identifies the
  3107.       error code and the second the device.
  3108. --------------------------------------------------
  3109. INT 15 - READ/MODIFY PROFILES (CONVERTIBLE)
  3110.     AH = 40h
  3111.     AL = subfunction
  3112.         0: get system profile in CX and BX
  3113.         1: set system profile from CX and BX
  3114.         2: get internal modem profile in BX
  3115.         3: set internal modem profile from BX
  3116. --------------------------------------------------
  3117. INT 15 - SYSTEM - WAIT ON EXTERNAL EVENT (CONVERTIBLE)
  3118.     AH = 41h
  3119.     AL = condition type
  3120.         bits 0-2: condition to wait for
  3121.              0 any external event
  3122.              1 compare and return if equal
  3123.              2 compare and return if not equal
  3124.              3 test and return if not zero
  3125.              4 test and return if zero
  3126.         bit 3:    reserved
  3127.         bit 4:    1=port address, 0=user byte
  3128.         bits 5-7: reserved
  3129.     BH = condition compare or mask value
  3130.     BL = timeout value times 55 milliseconds
  3131.         0 means no timeout
  3132.     DX = I/O port address if AL bit 4 set
  3133.     ES:DI -> user byte if AL bit 4 clear
  3134. --------------------------------------------------
  3135. INT 15 - SYSTEM - REQUEST POWER OFF (CONVERTIBLE)
  3136.     AH = 42h
  3137.     AL = 0 to use system profile
  3138.          1 to force suspend regardless of system profile
  3139. --------------------------------------------------
  3140. INT 15 - SYSTEM - READ SYSTEM STATUS (CONVERTIBLE)
  3141.     AH = 43h
  3142. Return: AL = status bits
  3143.         bit 0: LCD detached
  3144.         bit 1: reserved
  3145.         bit 2: RS232/parallel adapter powered on
  3146.         bit 3: internal modem powered on
  3147.         bit 4: power activated by alarm
  3148.         bit 5: standby power lost
  3149.         bit 6: external power in use
  3150.         bit 7: power low
  3151. --------------------------------------------------
  3152. INT 15 - SYSTEM - (DE)ACTIVATE INTERNAL MODEM POWER (CONVERTIBLE)
  3153.     AH = 44h
  3154.     AL = 0 to power off
  3155.          1 to power on
  3156. --------------------------------------------------
  3157. INT 15 - OS HOOK - KEYBOARD INTERCEPT (AT model 3x9,XT2,XT286,CONV,PS)
  3158.     AH = 4Fh
  3159.     AL = scan code
  3160.     CF set
  3161. Return: CF set
  3162.        AL = scan code
  3163.     CF clear
  3164.        scan code should not be used
  3165. Note: Called by INT 9 handler to translate scan codes
  3166. --------------------------------------------------
  3167. INT 15 - OS HOOK - DEVICE OPEN (AT,XT2,XT286,PS)
  3168.     AH = 80h
  3169.     BX = device ID
  3170.     CX = process type
  3171. Return: CF set on error
  3172.     AH = status
  3173. --------------------------------------------------
  3174. INT 15 - OS HOOK - DEVICE CLOSE (AT,XT2,XT286,PS)
  3175.     AH = 81h
  3176.     BX = device ID
  3177.     CX = process type
  3178. Return: CF set on error
  3179.     AH = status
  3180. --------------------------------------------------
  3181. INT 15 - OS HOOK - DEVICE PROGRAM TERMINATE (AT,XT2,XT286,PS)
  3182.     AH = 82h
  3183.     BX = device ID
  3184. Return: CF set on error
  3185.     AH = status
  3186. Note: closes all devices opened with function 80h
  3187. --------------------------------------------------
  3188. INT 15 - SYSTEM - EVENT WAIT (AT,XT286,CONV,PS)
  3189.     AH = 83h
  3190.     AL = subservice
  3191.         0 = set interval
  3192.         1 = cancel
  3193.     ES:BX -> event flag (bit 7 set when interval expires)
  3194.     CX:DX = number of microseconds to wait (only accurate to 977 us)
  3195. Return: CF set if function already busy
  3196. --------------------------------------------------
  3197. INT 15 - SYSTEM - READ JOYSTICK (AT,XT2,XT286,PS)
  3198.     AH = 84h
  3199.     DX = subservice
  3200.         0 get switch settings
  3201.           Return: AL = switch settings (bits 7-4)
  3202.         1 read joystick inputs
  3203.           Return: AX = A(x) value
  3204.               BX = A(y) value
  3205.               CX = B(x) value
  3206.               DX = B(y) value
  3207. --------------------------------------------------
  3208. INT 15 - OS HOOK - SYSTEM REQUEST KEY PRESSED (AT,XT2,XT286,CONV,PS)
  3209.     AH = 85h
  3210.     AL = 0 press
  3211.        = 1 release
  3212. Return: CF set on error
  3213.     AH = status
  3214. Note: called by keyboard decode routine
  3215. --------------------------------------------------
  3216. INT 15 - SYSTEM - WAIT (AT,XT2,XT286,CONV,PS)
  3217.     AH = 86h
  3218.     CX,DX = number of microseconds to wait (only accurate to 977 us)
  3219. Return: CF clear: after wait elapses
  3220.     CF set: immediately due to error
  3221. --------------------------------------------------
  3222. INT 15 - EXTENDED MEMORY - BLOCK MOVE (AT,XT286,PS)
  3223.     AH = 87h
  3224.     CX = number of words to move
  3225.     ES:SI -> global descriptor table
  3226.         00h-0Fh zero
  3227.         10h-11h source segment length in bytes (2*CX-1 or greater)
  3228.         12h-14h 24-bit linear source address
  3229.         15h     access rights byte (93h)
  3230.         16h-17h zero
  3231.         18h-19h destination segment length in bytes (2*CX-1 or greater)
  3232.         1Ah-1Ch 24-bit linear destination address
  3233.         1Dh     access rights byte (93h)
  3234.         1Eh-2Fh zero   
  3235. Return: CF set on error
  3236.     AH = status
  3237.         00h source copied into destination
  3238.         01h parity error
  3239.         02h interrupt error
  3240.         03h address line 20 gating failed
  3241. --------------------------------------------------
  3242. INT 15 - EXTENDED MEMORY - GET MEMORY SIZE (AT,XT286,PS)
  3243.     AH = 88h
  3244. Return: AX = memory size in K
  3245. --------------------------------------------------
  3246. INT 15 - SYSTEM - SWITCH TO VIRTUAL MODE (AT,XT286,PS50+)
  3247.     AH = 89h
  3248.     BL = interrupt number of IRQ0 (IRQ1-7 use next 7 interrupts)
  3249.     BH = interrupt number of IRQ8 (IRQ9-F use next 7 interrupts)
  3250.     DS:SI -> GDT for protected mode
  3251.            offset 0h  null descriptor
  3252.               8h  GDT descriptor
  3253.              10h  IDT descriptor
  3254.              18h  DS
  3255.              20h  ES
  3256.              28h  SS
  3257.              30h  CS
  3258.              38h  uninitialized, used to build descriptor for BIOS CS
  3259.     CX = offset into protected-mode CS to jump to
  3260. Return: CF set on error
  3261.        AH = 0FFh  error enabling address line 20
  3262. --------------------------------------------------
  3263. INT 15 - OS HOOK - DEVICE BUSY LOOP (AT,XT2,XT286,CONV,PS)
  3264.     AH = 90h
  3265.     AL = type code
  3266.         00h: disk
  3267.         01h: diskette
  3268.         02h: keyboard
  3269.         03h: PS/2 pointing device
  3270.         80h: network
  3271.         FCh: disk reset
  3272.         FDh: diskette motor start
  3273.         FEh: printer
  3274.     ES:BX -> request block for type codes 80h through BFh
  3275. Return: CF set if wait time satisfied
  3276.     CF clear if driver must perform wait
  3277. Note: type codes are allocated as follows:
  3278.     00-7F non-reentrant devices; OS must arbitrate access
  3279.     80-BF reentrant devices; ES:BX points to a unique control block
  3280.     C0-FF wait-only calls, no complementary INT 15/AH=91h call
  3281. --------------------------------------------------
  3282. INT 15 - OS HOOK - SET FLAG AND COMPLETE INTERRUPT (AT,XT2,XT286,CONV,PS)
  3283.     AH = 91h
  3284.     AL = type code, see AH=90h above
  3285.     ES:BX -> request block for type codes 80h through BFh
  3286. Return: AH = 0
  3287. --------------------------------------------------
  3288. INT 15 - SYSTEM - GET CONFIGURATION (XT after 1/10/86,AT mdl 3x9,CONV,XT286,PS)
  3289.     AH = C0h
  3290. Return: CF set if BIOS doesn't support call
  3291.     ES:BX -> ROM table
  3292.          byte_count  dw   ?   ; number of bytes following
  3293.          model     db   ?   ; PC=ff, XT=fe or fb, PCjr = fd, etc, etc
  3294.          submodel     db   ?   ; distingushes between AT and XT/286, etc.
  3295.          BIOS_rev     db   ?   ; 0 for first release, 1 for 2nd, etc.
  3296.          featbyte     db   ?   ; 80h = DMA channel 3 used by hd BIOS
  3297.                   ; 40h = 2nd 8259 installed
  3298.                   ; 20h = Real-Time Clock installed
  3299.                   ; 10h = INT 15h/AH=4Fh called upon INT 9h
  3300.                   ;  8h = wait for external event supported
  3301.                   ;  4h = extended BIOS area allocated at 640K
  3302.                   ;  2h = bus is Micro Channel instead of PC
  3303.                   ;  1h   reserved
  3304.          res1     dw   0
  3305.          res2     dw   0
  3306. Note: the 1/10/86 XT BIOS returns an incorrect value for featbyte.
  3307. --------------------------------------------------
  3308. INT 15 - SYSTEM - RETURN EXTENDED-BIOS DATA-AREA SEGMENT ADDRESS (PS)
  3309.     AH = C1h
  3310. Return: CF set on error
  3311.     ES = segment of data area
  3312. --------------------------------------------------
  3313. INT 15 - POINTING DEVICE BIOS INTERFACE (PS,DESQview 2.x)
  3314.     AH = C2h
  3315.     AL = subfunction
  3316.         00h enable/disable
  3317.            BH = 00h disable
  3318.             01h enable
  3319.         01h reset
  3320.            Return: BH = device ID
  3321.         02h set sampling rate
  3322.            BH = 00h 10/second
  3323.             01h 20/second
  3324.             02h 40/second
  3325.             03h 60/second
  3326.             04h 80/second
  3327.             05h 100/second
  3328.             06h 200/second
  3329.         03h set resolution
  3330.            BH = 00h one count per mm
  3331.             01h two counts per mm
  3332.             02h four counts per mm
  3333.             03h eight counts per mm
  3334.         04h get type
  3335.            Return: BH = device ID
  3336.         05h initialize
  3337.            BH = data package size (1 - 8 bytes)
  3338.         06h get/set scaling factor
  3339.            BH = 00h return device status
  3340.                Return: BL = status
  3341.                    bit 0: right button pressed
  3342.                    bit 1: reserved
  3343.                    bit 2: left button pressed
  3344.                    bit 3: reserved
  3345.                    bit 4: 0 if 1:1 scaling, 1 if 2:1 scaling
  3346.                    bit 5: device enabled
  3347.                    bit 6: 0 if stream mode, 1 if remote mode
  3348.                    bit 7: reserved
  3349.                    CL = resolution (see function 03h)
  3350.                    DL = sample rate, reports per second
  3351.             01h set scaling at 1:1
  3352.             02h set scaling at 2:1
  3353.         07h set device handler address
  3354.            ES:BX = user device handler
  3355. Return: CF set on error
  3356.     AH = status
  3357.         00h successful
  3358.         01h invalid function
  3359.         02h invalid input
  3360.         03h interface error
  3361.         04h need to resend
  3362.         05h no device handler installed
  3363. -------------------------------------------------
  3364. INT 15 - ENABLE/DISABLE WATCHDOG TIMEOUT (PS50+)
  3365.     AH = C3h
  3366.     AL = 00h disable
  3367.          01h enable
  3368.         BX = timer counter
  3369. Return: CF set on error
  3370. Note: the watchdog timer generates an NMI
  3371. --------------------------------------------------
  3372. INT 15 - PROGRAMMABLE OPTION SELECT (PS50+)
  3373.     AH = C4h
  3374.     AL = 00h return base POS register address
  3375.          01h enable slot
  3376.          BL = slot number
  3377.          02h enable adapter
  3378. Return: CF set on error
  3379.     DX = base POS register address (if function 00h)
  3380. --------------------------------------------------
  3381. INT 15 - DESQview - GET PROGRAM NAME
  3382.     AX = DE00h
  3383. Return: AX = offset into DESQVIEW.DVO of current program's record:
  3384.            BYTE  length of name
  3385.          N BYTES name
  3386.          2 BYTES keys to invoke program (second = 00h if only one key used)
  3387.            WORD  ??? (I see 0 always)
  3388.            BYTE  end flag: 00h for all but last entry, which is FFh
  3389. --------------------------------------------------
  3390. INT 15 - DESQview - UPDATE "OPEN WINDOW" MENU
  3391.     AX = DE01h
  3392. Return: nothing
  3393. Note: reads DESQVIEW.DVO, disables Open menu if file not in current directory
  3394. --------------------------------------------------
  3395. INT 15 - DESQview - UNIMPLEMENTED IN DV 2.0x
  3396.     AX = DE02h
  3397. Return: nothing (NOP in DV 2.0x)
  3398. --------------------------------------------------
  3399. INT 15 - DESQview - UNIMPLEMENTED IN DV 2.0x
  3400.     AX = DE03h
  3401. Return: nothing (NOP in DV 2.0x)
  3402. --------------------------------------------------
  3403. INT 15 - DESQview - GET AVAILABLE COMMON MEMORY
  3404.     AX = DE04h
  3405. Return: BX = bytes of common memory available
  3406.     CX = largest block available
  3407.     DX = total common memory in bytes
  3408. --------------------------------------------------
  3409. INT 15 - DESQview - GET AVAILABLE CONVENTIONAL MEMORY
  3410.     AX = DE05h
  3411. Return: BX = K of memory available
  3412.     CX = largest block available
  3413.     DX = total conventional memory in K
  3414. --------------------------------------------------
  3415. INT 15 - DESQview - GET AVAILABLE EXPANDED MEMORY
  3416.     AX = DE06h
  3417. Return: BX = K of expanded memory available
  3418.     CX = largest block available
  3419.     DX = total expanded memory in K
  3420. --------------------------------------------------
  3421. INT 15 - DESQview - "APPNUM" - GET CURRENT PROGRAM'S NUMBER
  3422.     AX = DE07h
  3423. Return: AX = number of program as it appears on the "Switch Windows" menu
  3424. --------------------------------------------------
  3425. INT 15 - DESQview - GET ???
  3426.     AX = DE08h
  3427. Return: AX = 0    ???
  3428.          1    ???
  3429. --------------------------------------------------
  3430. INT 15 - DESQview - UNIMPLEMENTED IN DV 2.00
  3431.     AX = DE09h
  3432. Return: nothing (NOP in DV 2.00)
  3433. --------------------------------------------------
  3434. INT 15 - DESQview 2.0 - "DBGPOKE" - DISPLAY CHARACTER ON STATUS LINE
  3435.     AX = DE0Ah
  3436.     BL = character
  3437. Return: character displayed, next call will display in next position (which
  3438.     wraps back to the start of the line if off the right edge of screen)
  3439. Notes:    displays character on bottom line of *physical* screen, regardless
  3440.     of current size of window (even entirely hidden)
  3441.     does not know about graphics display modes, just pokes the characters
  3442.     into display memory
  3443. --------------------------------------------------
  3444. INT 15 - DESQview 2.0 - "APILEVEL" - DEFINE MINIMUM API LEVEL REQUIRED
  3445.     AX = DE0Bh
  3446.     BL = API level
  3447.          >2 pops up "You need a newer version" error window in DV 2.00
  3448.     BH = ???
  3449. Return: AX = maximum API level???
  3450. --------------------------------------------------
  3451. INT 15 - DESQview 2.0 - "GETMEM" - ALLOCATE "SYSTEM" MEMORY
  3452.     AX = DE0Ch
  3453.     BX = number of bytes
  3454. Return: ES:DI -> allocated block
  3455. --------------------------------------------------
  3456. INT 15 - DESQview 2.0 - "PUTMEM" - DEALLOCATE "SYSTEM" MEMORY
  3457.     AX = DE0Dh
  3458.     ES:DI -> previously allocated block
  3459. Return: nothing
  3460. --------------------------------------------------
  3461. INT 15 - DESQview 2.0 - FIND MAILBOX BY NAME
  3462.     AX = DE0Eh
  3463.     ES:DI -> name to find
  3464.     CX = length of name
  3465. Return: BX = 0 not found
  3466.          1 found
  3467.         DS:SI = object handle
  3468. --------------------------------------------------
  3469. INT 15 - DESQview 2.0 - ENABLE DESQview EXTENSIONS
  3470.     AX = DE0Fh
  3471. Return: AX and BX destroyed (seems to be bug, weren't saved&restored)
  3472. Notes: sends a manager stream with opcodes AEh, BDh, and BFh to task's window
  3473.       enables an additional mouse mode
  3474. --------------------------------------------------
  3475. INT 15 - DESQview 2.0 - "PUSHKEY" - PUT KEY INTO KEYBOARD INPUT STREAM
  3476.     AX = DE10h
  3477.     BH = scan code
  3478.     BL = character
  3479. Return: BX = ??? (sometimes, but not always, same as BX passed in)
  3480. Note: a later read will get the keystroke as if it had been typed by the user
  3481. --------------------------------------------------
  3482. INT 15 - DESQview 2.0 - ENABLE/DISABLE AUTOMATIC JUSTIFICATION OF WINDOW
  3483.     AX = DE11h
  3484.     BL = 0          viewport will not move automatically
  3485.          nonzero  viewport will move to keep cursor visible
  3486. Return: nothing
  3487. --------------------------------------------------
  3488. INT 15 - DESQview 2.01 - ???
  3489.     AX = DE12h
  3490.     BX = 0          clear ???
  3491.          nonzero  set ???
  3492. Return: nothing
  3493. --------------------------------------------------
  3494. INT 16 - KEYBOARD - READ CHAR FROM BUFFER, WAIT IF EMPTY
  3495.     AH = 00h
  3496. Return: AH = scan code
  3497.     AL = character
  3498. --------------------------------------------------
  3499. INT 16 - KEYBOARD - CHECK BUFFER, DO NOT CLEAR
  3500.     AH = 01h
  3501. Return: ZF = 0 character in buffer
  3502.         AH = scan code
  3503.         AL = character
  3504.     ZF = 1 no character in buffer
  3505. --------------------------------------------------
  3506. INT 16 - KEYBOARD - GET SHIFT STATUS
  3507.     AH = 02h
  3508.     AL = shift status bits
  3509.         0 = right shift key depressed
  3510.         1 = left shift key depressed
  3511.         2 = CTRL depressed
  3512.         3 = ALT depressed
  3513.         4 = SCROLL LOCK active
  3514.         5 = NUM LOCK active
  3515.         6 = CAPS LOCK active
  3516.         7 = INSERT state active
  3517. --------------------------------------------------
  3518. INT 16 - KEYBOARD - SET DELAYS (Jr,AT model 339,XT286,PS)
  3519.     AH = 03h
  3520.     AL = subfunction
  3521.         0 reset typematic (PCjr)
  3522.         1 increase initial delay (PCjr)
  3523.         2 increase continuing delay (PCjr)
  3524.         3 increase both delays (PCjr)
  3525.         4 turn off typematic (PCjr)
  3526.         5 Set typematic rate (AT or PS/2)
  3527.     BH = 00 - 03 for delays of 250ms, 500ms, 750ms, or 1s
  3528.     BL = 00 - 1F for typematic rates of 30cps down to 2cps
  3529. --------------------------------------------------
  3530. INT 16 - KEYBOARD - KEYCLICK (Jr,CONV)
  3531.     AH = 04h
  3532.     AL =
  3533.         0 click off
  3534.         1 click on
  3535. --------------------------------------------------
  3536. INT 16 - KEYBOARD - WRITE TO KEYBOARD BUFFER (AT model 339,XT2,XT286,PS)
  3537.     AH = 05h
  3538.     CH = scan code
  3539.     CL = character
  3540. Return: AL = 1 if buffer full
  3541. --------------------------------------------------
  3542. INT 16 - KEYBOARD - GET ENHANCED KEYSTROKE (AT model 339,XT2,XT286,PS)
  3543.     AH = 10h
  3544. Return: AH = scan code
  3545.     AL = character
  3546. --------------------------------------------------
  3547. INT 16 - KEYBOARD - CHECK ENHANCED KEYSTROKE (AT model 339,XT2,XT286,PS)
  3548.     AH = 11h
  3549. Return: ZF = 0 if keystroke available
  3550.         AH = scan code \ meaningless if ZF = 1
  3551.         AL = character /
  3552.     ZF = 1 if kbd buffer empty
  3553. --------------------------------------------------
  3554. INT 16 - KEYBOARD - GET ENHANCED SHIFT FLAGS (AT model 339,XT2,XT286,PS)
  3555.     AH = 12h
  3556. Return: AL (same as for AH=02h)
  3557.        bit 7: Ins ON
  3558.        bit 6: CapsLock ON
  3559.        bit 5: NumLock ON
  3560.        bit 4: ScrollLock ON
  3561.        bit 3: Either ALT key down
  3562.        bit 2: Either CTRL key down
  3563.        bit 1: Left shift key down
  3564.        bit 0: Right shift key down
  3565.     AH
  3566.        bit 7: SysReq key down
  3567.        bit 6: CapsLock key down
  3568.        bit 5: NumLock key down
  3569.        bit 4: ScrollLock key down
  3570.        bit 3: Right Alt key down
  3571.        bit 2: Right Ctrl key down
  3572.        bit 1: Left Alt key down
  3573.        bit 0: Right Alt key down
  3574. --------------------------------------------------
  3575. INT 17 - PRINTER - OUTPUT CHARACTER
  3576.     AH = 00h
  3577.     AL = character
  3578.     DX = printer port (0-3)
  3579. Return: AH = status bits
  3580.         0 = time out
  3581.         1 = unused
  3582.         2 = unused
  3583.         3 = I/O error
  3584.         4 = selected
  3585.         5 = out of paper
  3586.         6 = acknowledge
  3587.         7 = not busy
  3588. --------------------------------------------------
  3589. INT 17 - PRINTER - INITIALIZE
  3590.     AH = 01h
  3591.     DX = printer port (0-3)
  3592. Return: AH = status (see AH = 00h above)
  3593. --------------------------------------------------
  3594. INT 17 - PRINTER - GET STATUS
  3595.     AH = 02h
  3596.     DX = printer port (0-3)
  3597. Return: AH = status (see AH = 00h above)
  3598. --------------------------------------------------
  3599. INT 18 - TRANSFER TO ROM BASIC
  3600.    causes transfer to ROM-based BASIC (IBM-PC)
  3601.    often reboots a compatible; often has no effect at all
  3602. --------------------------------------------------
  3603. INT 19 - DISK BOOT
  3604.    causes reboot of disk system (no memory test performed)
  3605. --------------------------------------------------
  3606. INT 1A - CLOCK - GET TIME OF DAY
  3607.     AH = 00h
  3608. Return: CX:DX = clock count
  3609.     AL = 0 if clock was read or written (via AH=0,1)
  3610.            within the current 24-hour period
  3611.            Otherwise, AL > 0
  3612. --------------------------------------------------
  3613. INT 1A - CLOCK - SET TIME OF DAY
  3614.     AH = 01h
  3615.     CX:DX = clock count
  3616. Return: time of day set
  3617. --------------------------------------------------
  3618. INT 1A - CLOCK - READ REAL TIME CLOCK (AT,XT286,CONV,PS)
  3619.     AH = 02h
  3620. Return: CH = hours in BCD
  3621.     CL = minutes in BCD
  3622.     DH = seconds in BCD
  3623. --------------------------------------------------
  3624. INT 1A - CLOCK - SET REAL TIME CLOCK (AT,XT286,CONV,PS)
  3625.     AH = 03h
  3626.     CH = hours in BCD
  3627.     CL = minutes in BCD
  3628.     DH = seconds in BCD
  3629.     DL = 1, if daylight savings; 0 if standard time
  3630. Return: CMOS clock set
  3631. --------------------------------------------------
  3632. INT 1A - CLOCK - READ DATE FROM REAL TIME CLOCK (AT,XT286,CONV,PS)
  3633.     AH = 04h
  3634. Return: DL = day in BCD
  3635.     DH = month in BCD
  3636.     CL = year in BCD
  3637.     CH = century (19h or 20h)
  3638. --------------------------------------------------
  3639. INT 1A - CLOCK - SET DATE IN REAL TIME CLOCK (AT,XT286,CONV,PS)
  3640.     AH = 05h
  3641.     DL = day in BCD
  3642.     DH = month in BCD
  3643.     CL = year in BCD
  3644.     CH = century (19h or 20h)
  3645. Return: CMOS clock set
  3646. --------------------------------------------------
  3647. INT 1A - CLOCK - SET ALARM (AT,XT286,CONV,PS)
  3648.     AH = 06h
  3649.     CH = hours in BCD
  3650.     CL = minutes in BCD
  3651.     DH = seconds in BCD
  3652. Return: CF set if alarm already set or clock inoperable
  3653.     INT 4Ah will be called when alarm goes off, every 24 hours until reset
  3654. --------------------------------------------------
  3655. INT 1A - CLOCK - RESET ALARM (AT,XT286,CONV,PS)
  3656.     AH = 07h
  3657. Return: alarm disabled
  3658. --------------------------------------------------
  3659. INT 1A - CLOCK - SET RTC ACTIVATED POWER ON MODE (CONVERTIBLE)
  3660.     AH = 08h
  3661.     CH = hours in BCD
  3662.     CL = minutes in BCD
  3663.     DH = seconds in BCD
  3664. --------------------------------------------------
  3665. INT 1A - CLOCK - READ RTC ALARM TIME AND STATUS (CONV,PS30)
  3666.     AH = 09h
  3667. Return: CH = hours in BCD
  3668.     CL = minutes in BCD
  3669.     DH = seconds in BCD
  3670.     DL = alarm status
  3671.         0  alarm not enabled
  3672.         1  alarm enabled but will not power up system
  3673.         2  alarm will power up system
  3674. --------------------------------------------------
  3675. INT 1A - CLOCK - READ SYSTEM-TIMER DAY COUNTER (XT2,PS)
  3676.     AH = 0Ah
  3677. Return: CF set on error
  3678.     CX = count of days since Jan 1,1980
  3679. --------------------------------------------------
  3680. INT 1A - CLOCK - SET SYSTEM-TIMER DAY COUNTER (XT2,PS)
  3681.     AH = 0Bh
  3682.     CX = count of days since Jan 1,1980
  3683. Return: CF set on error
  3684. --------------------------------------------------
  3685. INT 1A - SET UP SOUND MULTIPLEXOR (PCjr ONLY)
  3686.     AH = 80h
  3687.     AL = 0 source is 8253 channel 2
  3688.          1 source is cassette input
  3689.          2 source is I/O channel "Audio IN"
  3690.          3 source is sound generator chip
  3691. --------------------------------------------------
  3692. INT 1B - CTRL-BREAK KEY
  3693.    This interrupt is called when the keyboard scanner of the IBM
  3694.    machines detects CTRL and BREAK pressed at the same time. It
  3695.    normally points to a short routine in DOS which sets the
  3696.    Ctrl-C flag, thus invoking INT 23h the next time DOS checks
  3697.    for Ctrl-C.
  3698. --------------------------------------------------
  3699. INT 1C - CLOCK TICK
  3700.    This interrupt is called (in the IBM) at the end of each time-update
  3701.    operation by the time-of-day routines.  It normally points to an IRET.
  3702. --------------------------------------------------
  3703. INT 1D -> 6845 VIDEO INIT TABLES
  3704.     table for modes 0 and 1   \
  3705.     table for modes 2 and 3    \ each table is 16 bytes long and
  3706.     table for modes 4,5, and 6 / contains values for 6845 registers
  3707.     table for mode 7      /
  3708.     4 words -- size of video RAM for modes 0/1, 2/3, 4/5, and 6/7
  3709.     8 bytes -- number of columns in each mode
  3710.     8 bytes -- video controller mode byte for each mode
  3711. --------------------------------------------------
  3712. INT 1E -> DISKETTE PARAMS (BASE TABLE)
  3713.     (Default at F000:EFC7 in PC and most compatibles)
  3714.     DB    step rate & head unload times
  3715.     DB    head load time & DMA
  3716.     DB    motor off time in clock ticks (36 or 37 typical)
  3717.     DB    sector size in bytes (0->128, 1->256, 2->512, 3->1024)
  3718.     DB    last sector number (8 or 9 typical)
  3719.     DB    inter-sector gap size on read/write (42 typical)
  3720.     DB    data transfer length (255 typical)
  3721.     DB    inter-sector gap size on format (80 typical)
  3722.     DB    sector fill on format (F6h typical)
  3723.     DB    head-settle time ms (typical 25, 1.10->0, 2.10->15, 3.10->1)
  3724.     DB    motor start-up time (1/8 secs) (typical 4, 2.10->2)
  3725. --------------------------------------------------
  3726. INT 1F -> GRAPHICS SET 2
  3727.        (NOT a vector!) pointer to bitmaps for high 128 chars
  3728. --------------------------------------------------
  3729. INT 20 - Minix - SEND/RECEIVE MESSAGE
  3730.     AX = process ID of other process
  3731.     BX = pointer to message
  3732.     CX = 1 send
  3733.          2 receive
  3734.          3 send&receive
  3735. Note: the message contains the system call number (numbered as in V7 Unix(tm))
  3736.       and the call parameters
  3737. --------------------------------------------------
  3738. INT 20 - DOS - PROGRAM TERMINATION
  3739. returns to DOS--identical to INT 21/AH=00h
  3740. --------------------------------------------------
  3741. INT 21 - DOS - PROGRAM TERMINATION
  3742.     AH = 00h
  3743. Return: never
  3744. --------------------------------------------------
  3745. INT 21 - DOS - KEYBOARD INPUT
  3746.     AH = 01h
  3747. Return: AL = character read
  3748. Note: ^C/^Break are checked, and INT 23h executed if read
  3749.       character is echoed to standard output
  3750. --------------------------------------------------
  3751. INT 21 - DOS - DISPLAY OUTPUT
  3752.     AH = 02h
  3753.     DL = character to send to standard output
  3754. Note: ^C/^Break are checked, and INT 23h executed if pressed
  3755. --------------------------------------------------
  3756. INT 21 - DOS - AUX INPUT
  3757.     AH = 03h
  3758. Return: AL = character read
  3759. --------------------------------------------------
  3760. INT 21 - DOS - AUX OUTPUT
  3761.     AH = 04h
  3762.     DL = character to send
  3763. --------------------------------------------------
  3764. INT 21 - DOS - PRINTER OUTPUT
  3765.     AH = 05h
  3766.     DL = character to print
  3767. --------------------------------------------------
  3768. INT 21 - DOS - DIRECT CONSOLE I/O CHARACTER OUTPUT
  3769.     AH = 06h
  3770.     DL = character <> FFh
  3771. --------------------------------------------------
  3772. INT 21 - DOS - DIRECT CONSOLE I/O CHARACTER INPUT
  3773.     AH = 06h
  3774.     DL = 0FFh
  3775. Return: ZF set     = no character
  3776.     ZF clear = character recieved
  3777.           AL = character
  3778. Notes: Character is echoed to STDOUT if received.
  3779.        ^C/^Break are NOT checked
  3780. --------------------------------------------------
  3781. INT 21 - DOS - DIRECT STDIN INPUT, NO ECHO
  3782.     AH = 07h
  3783. Note: same as function 06h for input but char not echoed
  3784. --------------------------------------------------
  3785. INT 21 - DOS - KEYBOARD INPUT, NO ECHO
  3786.     AH = 08h
  3787. Return: AL = character
  3788. Note: same as function 07h, but ^C/^Break are checked
  3789. --------------------------------------------------
  3790. INT 21 - DOS - PRINT STRING
  3791.     AH = 09h
  3792.     DS:DX = address of string terminated by "$"
  3793. Note: ^C/^Break checked, and INT 23h called if pressed
  3794. --------------------------------------------------
  3795. INT 21 - DOS - BUFFERED KEYBOARD INPUT
  3796.     AH = 0Ah
  3797.     DS:DX = address of buffer
  3798. Note: first byte of buffer must contain maximum length
  3799.       on entry, second byte contains actual length of previous line which may
  3800.     be recalled with the DOS line-editing commands
  3801.       on return the second byte contains actual length, third and
  3802.     subsequent bytes contain the input line
  3803. --------------------------------------------------
  3804. INT 21 - DOS - CHECK STANDARD INPUT STATUS
  3805.     AH = 0Bh
  3806. Return: AL = FFh if character available
  3807.          00h if no character
  3808. Note: ^C/^Break checked, and INT 23h called if pressed
  3809. --------------------------------------------------
  3810. INT 21 - DOS - CLEAR KEYBOARD BUFFER
  3811.     AH = 0Ch
  3812.     AL must be 1, 6, 7, 8, or 0Ah.
  3813. Notes: Flushes all typeahead input, then executes function specified by AL
  3814.        (effectively moving it to AH and repeating the INT 21 call).
  3815.        If AL contains a value not in the list above, the keyboard buffer is
  3816.        flushed and no other action is taken.
  3817. --------------------------------------------------
  3818. INT 21 - DOS - DISK RESET
  3819.     AH = 0Dh
  3820. Note: Flushes all disk buffers.
  3821. --------------------------------------------------
  3822. INT 21 - DOS - SELECT DISK
  3823.     AH = 0Eh
  3824.     DL = new default drive number (0 = A, 1 = B, etc.)
  3825. Return: AL = number of logical drives
  3826. --------------------------------------------------
  3827. INT 21 - DOS - OPEN DISK FILE
  3828.     AH = 0Fh
  3829.     DS:DX = address of FCB
  3830. Return: AL = 00h file found
  3831.          FFh file not found
  3832. Note: (DOS 3.x) file opened in compatibility mode
  3833. --------------------------------------------------
  3834. INT 21 - DOS - CLOSE DISK FILE
  3835.     AH = 10h
  3836.     DS:DX = address of FCB
  3837. Return: AL = 00h directory update successful
  3838.          FFh file not found in directory
  3839. --------------------------------------------------
  3840. INT 21 - DOS - SEARCH FIRST USING FCB
  3841.     AH = 11h
  3842.     DS:DX = address of FCB
  3843. Return: AL = status
  3844.         00h file found
  3845.         FFh file not found
  3846. Note: If file found, FCB is created at DTA address and set up to
  3847.       OPEN or DELETE it.
  3848. --------------------------------------------------
  3849. INT 21 - DOS - SEARCH NEXT USING FCB
  3850.     AH = 12h
  3851.     DS:DX = address of FCB
  3852. Return: AL = status
  3853.         00h file found
  3854.         FFh file not found
  3855. Note: If file found, FCB is created at DTA address and set up to
  3856.       OPEN or DELETE it.
  3857. --------------------------------------------------
  3858. INT 21 - DOS - DELETE FILE via FCB
  3859.     AH = 13h
  3860.     DS:DX = address of FCB with filename field filled with template for
  3861.         deletion ('?' wildcard allowed)
  3862. Return: AL = status
  3863.         00h file found
  3864.         FFh file not found
  3865. --------------------------------------------------
  3866. INT 21 - DOS - SEQUENTIAL DISK FILE READ
  3867.     AH = 14h
  3868.     DS:DX = address of FCB
  3869. Return: AL = status
  3870.         0 successful read
  3871.         1 end of file
  3872.         2 data transfer area too small
  3873.         3 partial record, EOF
  3874. --------------------------------------------------
  3875. INT 21 - DOS - SEQUENTIAL DISK RECORD WRITE
  3876.     AH = 15h
  3877.     DS:DX = address of FCB
  3878. Return: AL = status
  3879.         0 successful write
  3880.         1 disk full
  3881.         2 data transfer area too small
  3882. --------------------------------------------------
  3883. INT 21 - DOS - CREATE A DISK FILE
  3884.     AH = 16h
  3885.     DS:DX = address of FCB
  3886. Return: AL = status
  3887.         00h successful creation
  3888.         FFh directory full
  3889. Note: if file already exists, it is truncated to zero length
  3890. --------------------------------------------------
  3891. INT 21 - DOS - RENAME FILE via FCB
  3892.     AH = 17h
  3893.     DS:DX = address of FCB
  3894.     FCB contains new name starting at byte 17h.
  3895. Return: AL = status
  3896.         00h file found
  3897.         FFh file not found
  3898. --------------------------------------------------
  3899. INT 21 - DOS Internal - UNUSED
  3900.     AH = 18h
  3901. Return: AL = 0
  3902. --------------------------------------------------
  3903. INT 21 - DOS - GET DEFAULT DISK NUMBER
  3904.     AH = 19h
  3905. Return: AL = current drive number (letter - 'A')
  3906. --------------------------------------------------
  3907. INT 21 - DOS - SET DISK TRANSFER AREA ADDRESS
  3908.     AH = 1Ah
  3909.     DS:DX = address of buffer
  3910. --------------------------------------------------
  3911. INT 21 - DOS - ALLOCATION TABLE INFORMATION
  3912.     AH = 1Bh
  3913. Return: DS:BX points to FAT ID byte for default drive
  3914.     DX = number of allocation units on disk
  3915.     AL = number of sectors per allocation unit (cluster)
  3916.     CX = number of bytes per sector
  3917. --------------------------------------------------
  3918. INT 21 - DOS - ALLOCATION TABLE INFORMATION FOR SPECIFIC DEVICE
  3919.     AH = 1Ch
  3920.     DL = Drive Number to check
  3921. Return: DS:BX points to FAT ID byte
  3922.     DX = number of allocation units on disk
  3923.     AL = number of sectors per allocation unit (cluster)
  3924.     CX = number of bytes per sector
  3925. --------------------------------------------------
  3926. INT 21 - DOS Internal - UNUSED
  3927.     AH = 1Dh
  3928. Return: AL = 0
  3929. --------------------------------------------------
  3930. INT 21 - DOS Internal - UNUSED
  3931.     AH = 1Eh
  3932. Return: AL = 0
  3933. --------------------------------------------------
  3934. INT 21 - DOS Internal - GET DEFAULT DRIVE PARAMETER BLOCK
  3935.     AH = 1Fh
  3936. Return: AL = 00h No Error
  3937.          FFh Error
  3938.     DS:BX -> drive parameter block
  3939. Note: for DOS 2.x and 3.x, this just invokes function 32h with DL = 0
  3940. --------------------------------------------------
  3941. INT 21 - DOS Internal - UNUSED
  3942.     AH = 20h
  3943. Return: AL = 0
  3944. --------------------------------------------------
  3945. INT 21 - DOS - RANDOM DISK RECORD READ
  3946.     AH = 21h
  3947.     DS:DX = address of FCB
  3948. Return: AL = status
  3949.         0 successful read
  3950.         1 end of file
  3951.         2 data transfer area too small
  3952.         3 partial record, EOF
  3953. --------------------------------------------------
  3954. INT 21 - DOS - RANDOM DISK RECORD WRITE
  3955.     AH = 22h
  3956.     DS:DX = address of FCB
  3957. Return: AL = status (see AH = 21h above)
  3958. --------------------------------------------------
  3959. INT 21 - DOS - GET FILE SIZE
  3960.     AH = 23h
  3961.     DS:DX = address of unopened FCB with filename and record size fields
  3962.         initialized
  3963. Return: AL = status
  3964.         00h file found
  3965.         FFh file not found
  3966. Note: FCB's random-record field set to number of records (rounded up)
  3967. --------------------------------------------------
  3968. INT 21 - DOS - SET RANDOM RECORD FIELD
  3969.     AH = 24h
  3970.     DS:DX = address of FCB
  3971. Return: Random Record Field of FCB is set to be same as Current Block
  3972.     and Current Record.
  3973. Note: FCB must be OPEN already
  3974. --------------------------------------------------
  3975. INT 21 - DOS - SET INTERRUPT VECTOR
  3976.     AH = 25h
  3977.     AL = interrupt number
  3978.     DS:DX = new vector to be used for specified interrupt
  3979. --------------------------------------------------
  3980. INT 21 - DOS - CREATE PSP
  3981.     AH = 26h
  3982.     DX = Segment number to set up PSP at
  3983. Return: Current PSP is copied to specified segment
  3984. Note:    new PSP is updated with memory size information; INTs 22h, 23h, 24h
  3985.     taken from interrupt vector table
  3986. --------------------------------------------------
  3987. INT 21 - DOS - RANDOM BLOCK READ
  3988.     AH = 27h
  3989.     DS:DX = address of FCB
  3990.     CX = number of records to be read
  3991. Return: AL = status
  3992.         0 successful read
  3993.         1 end of file
  3994.         2 data transfer area too small
  3995.         3 partial record, EOF
  3996. --------------------------------------------------
  3997. INT 21 - DOS - RANDOM BLOCK WRITE
  3998.     AH = 28h
  3999.     DS:DX = address of FCB
  4000.     CX = number of records to be written
  4001.          if zero, truncate file to current random file position
  4002. Return: AL = status
  4003.         0 successful write
  4004.         1 disk full
  4005.         2 data transfer area too small
  4006. --------------------------------------------------
  4007. INT 21 - DOS - PARSE FILENAME
  4008.     AH = 29h
  4009.     DS:SI -> string to parse
  4010.     ES:DI -> buffer to fill with unopened FCB
  4011.     AL = bit mask to control parsing
  4012.         0 = 0: parsing stops if file separator found
  4013.         1: leading separator ignored
  4014.         1 = 0: drive number in FCB set to default drive if not present
  4015.            in string
  4016.         1: drive number in FCB not changed
  4017.         2 = 0: filename in FCB set to blanks if no filename in string
  4018.         1: filename in FCB not changed if string does not contain
  4019.            a filename
  4020.         3 = 0: extension in FCB set to blanks if no extension in string
  4021.         1: extension left unchanged
  4022. Return: AL = 00h: no wildcards in name or extension
  4023.          01h: wildcards appeared
  4024.          FFh: drive specifier invalid
  4025.     DS:SI -> first byte after parsed string
  4026.     ES:DI buffer filled with unopened FCB
  4027. --------------------------------------------------
  4028. INT 21 - DOS - GET CURRENT DATE
  4029.     AH = 2Ah
  4030. Return: DL = day
  4031.     DH = month
  4032.     CX = year
  4033.     AL = day of the week (0=Sunday, 1=Monday, etc.)
  4034. --------------------------------------------------
  4035. INT 21 - DOS - SET CURRENT DATE
  4036.     AH = 2Bh
  4037.     DL = day
  4038.     DH = month
  4039.     CX = year
  4040. Return: AL = 00h if no error
  4041.        = FFh if bad value sent to routine
  4042. Note: DOS 3.3 also sets CMOS clock
  4043. --------------------------------------------------
  4044. INT 21 - DESQview - INSTALLATION CHECK
  4045.     AH = 2Bh
  4046.     AL = subfunction (DV v2.00+)
  4047.         01h get version
  4048.         Return: BX = version (BH = major, BL = minor)
  4049.         Note: early copies of v2.00 return 0002h
  4050.         02h get shadow buffer info, and start shadowing
  4051.         Return: BH = rows in shadow buffer
  4052.             BL = columns in shadow buffer
  4053.             DX = segment of shadow buffer
  4054.         04h get shadow buffer info
  4055.         Return: BH = rows in shadow buffer
  4056.             BL = columns in shadow buffer
  4057.             DX = segment of shadow buffer
  4058.         05h stop shadowing
  4059.     CX = 4445h ('DE')
  4060.     DX = 5351h ('SQ')
  4061. Return: AL = FFh if DESQview not installed
  4062. Note:    in DESQview v1.x, there were no subfunctions; this call only identified
  4063.     whether or not DESQview was loaded
  4064. --------------------------------------------------
  4065. INT 21 - DOS - GET CURRENT TIME
  4066.     AH = 2Ch
  4067. Return: CH = hours
  4068.     CL = minutes
  4069.     DH = seconds
  4070.     DL = hundredths of seconds
  4071. Note: time is updated approximately every 5/100 second
  4072. --------------------------------------------------
  4073. INT 21 - DOS - SET CURRENT TIME
  4074.     AH = 2Dh
  4075.     CH = hours
  4076.     CL = minutes
  4077.     DH = seconds
  4078.     DL = hundredths of seconds
  4079. Return: AL = 00h if no error
  4080.        = FFh if bad value sent to routine
  4081. Note: DOS 3.3 also sets CMOS clock
  4082. --------------------------------------------------
  4083. INT 21 - DOS - SET VERIFY FLAG
  4084.     AH = 2Eh
  4085.     DL = 0
  4086.     AL = 1 VERIFY on
  4087.          0 VERIFY off
  4088. --------------------------------------------------
  4089. INT 21 - DOS 2+ - GET DISK TRANSFER AREA ADDRESS
  4090.     AH = 2Fh
  4091. Return: ES:BX = address of DTA
  4092. --------------------------------------------------
  4093. INT 21 - DOS 2+ - GET DOS VERSION
  4094.     AH = 30h
  4095. Return: AL = Major Version number (0 for DOS 1.x)
  4096.     AH = Minor Version number
  4097.     BH = OEM number
  4098.         00h IBM
  4099.         16h DEC
  4100.     BL:CX = 24-bit user number
  4101. --------------------------------------------------
  4102. INT 21 - DOS 2+ - TERMINATE BUT STAY RESIDENT
  4103.     AH = 31h
  4104.     AL = exit code
  4105.     DX = program size, in paragraphs
  4106. --------------------------------------------------
  4107. INT 21 - DOS Internal - GET DRIVE PARAMETER BLOCK
  4108.     AH = 32h
  4109.     DL = drive number
  4110.         0 = default, 1 = A, etc.
  4111. Return: AL = 0FFh if invalid drive number, else
  4112.     DS:BX -> drive parameter block.
  4113.  
  4114. Structure of DOS Drive Parameter Block:
  4115. Offset    Size    Description
  4116.  00h    BYTE    drive number (0 = A, etc.)
  4117.  01h    BYTE    unit number within device driver
  4118.  02h    WORD    number of bytes per sector
  4119.  04h    BYTE    largest sector number in cluster (one less than sect/clust)
  4120.  05h    BYTE    log base two of the cluster size
  4121.  06h    WORD    number of reserved (boot) sectors
  4122.  08h    BYTE    number of copies of the FAT
  4123.  09h    WORD    number of root directory entries
  4124.  0Bh    WORD    first data sector on medium
  4125.  0Dh    WORD    largest possible cluster number (one more than # data clust)
  4126.  0Fh    BYTE    number of sectors in one FAT copy
  4127.  10h    WORD    first sector of root directory
  4128.  12h    DWORD    address of device driver for this drive
  4129.  16h    BYTE    media descriptor byte for medium
  4130.  17h    BYTE    FFh indicates block must be rebuilt
  4131.         (DOS 3.x) 00h indicates block accessed
  4132.  18h    DWORD    address of next device block, offset = FFFFh indicates last
  4133. ---DOS 2.x only---
  4134.  1Ch    WORD    starting cluster of current directory (0 = root directory)
  4135.  1Eh 64 BYTEs    ASCIZ current directory path string
  4136. ---DOS 3.x---
  4137. ; this was always:
  4138.  1Ch    WORD = 0    probably unused, values left from before
  4139.  1Eh    WORD = 0FFFFh    block was built
  4140. --------------------------------------------------
  4141. INT 21 - DOS 2+ - EXTENDED CONTROL-BREAK CHECKING
  4142.     AH = 33h
  4143.     AL = subfunction
  4144.         00h get state
  4145.         01h set state
  4146.            DL = 0 for OFF or 1 for ON
  4147.         02h internal, called by PRINT.COM (DOS 3.1)
  4148.         05h internal, return boot drive in DL (1=A:) (not in DOS 3.1)
  4149. Return: DL = current BREAK setting if AL = 00h
  4150.         0 BREAK=OFF
  4151.         1 BREAK=ON
  4152.     AL = FFh if error
  4153. --------------------------------------------------
  4154. INT 21 - DOS Internal - RETURN CritSectFlag POINTER
  4155.     AH = 34h
  4156. Return: ES:BX -> 1-byte DOS "Critical Section Flag", also known as InDOS flag
  4157. Notes:    when the critical section flag is nonzero, code within DOS is being
  4158.     executed.  It is safe to enter DOS when both the critical section flag
  4159.     and the critical error flag are zero.
  4160.  
  4161.     The critical error flag is the byte after the critical section flag in
  4162.     DOS 2.x, and the byte BEFORE the critical section flag in DOS 3.x 
  4163.     (except COMPAQ DOS 3.0, where the critical error flag is located 1AAh
  4164.     bytes BEFORE the critical section flag)
  4165. --------------------------------------------------
  4166. INT 21 - DOS 2+ - GET INTERRUPT VECTOR
  4167.     AH = 35h
  4168.     AL = interrupt number
  4169. Return: ES:BX = value of interrupt vector
  4170. --------------------------------------------------
  4171. INT 21 - DOS 2+ - GET DISK SPACE
  4172.     AH = 36h
  4173.     DL = drive code (0 = default, 1 = A, 2 = B, etc.)
  4174. Return: AX = number of sectors per cluster
  4175.          or 0FFFFh if invalid drive
  4176.     BX = number of available clusters
  4177.     CX = bytes per sector
  4178.     DX = total clusters
  4179. Note: multiply AX * CX * BX for free space on disk
  4180.       multiply AX * CX * DX for total disk space
  4181. --------------------------------------------------
  4182. INT 21 - DOS Internal - SWITCHAR/AVAILDEV
  4183.     AH = 37h
  4184.     AL = subfunction
  4185.        0 Read switch character (returns current character in DL)
  4186.        1 Set switch character (specify new character in DL)
  4187.        2 (DOS 2.x only) Read device availability (as set by function AL=3)
  4188.        3 (DOS 2.x only) Set device availability, where:
  4189.          DL = 0 means /DEV/ must preceed device names
  4190.          DL <> 0 means /DEV/ need not preceed device names
  4191. Return: DL = Switch character (if AL=0 or 1)
  4192.          Device availability flag (if AL=2 or 3)
  4193.     AL=0FFh means the value in AL was not in the range 0-3.
  4194. --------------------------------------------------
  4195. INT 21 - DOS 2+ - GET COUNTRY-DEPENDENT INFORMATION
  4196.     AH = 38h
  4197. --DOS 2.x--
  4198.     AL = 0    get current-country info
  4199.     DS:DX = segment:offset of buffer for returned info
  4200. Return: BX = country code
  4201.     buffer at DS:DX filled as follows:
  4202.        bytes 0-1 = date format   0 = USA    mm dd yy
  4203.                      1 = Europe dd mm yy
  4204.                      2 = Japan    yy mm dd
  4205.        byte 2    = currency symbol
  4206.        byte 3    = 00h
  4207.        byte 4    = thousands separator char
  4208.        byte 5    = 00h
  4209.        byte 6    = decimal separator char
  4210.        byte 7    = 00h
  4211.        bytes 8-1Fh reserved
  4212.  
  4213. --DOS 3.x--
  4214.     AL = 0 for current country
  4215.     AL = 01h thru 0FEh for specific country with code <255
  4216.     AL = 0FFh for specific country with code >= 255
  4217.        BX = 16-bit country code
  4218.     DS:DX = segment:offset of buffer for returned info
  4219.     DX = 0FFFFh if setting country code, rather than getting info
  4220. Return: (if DX <> 0FFFFh)
  4221.     BX = country code
  4222.     DS:DX filled in:
  4223.           bytes 0-1 = date format (see above)
  4224.           bytes 2-6 = currency symbol string, ASCIZ
  4225.           byte 7    = thousands seaprator char
  4226.           byte 8    = 00h
  4227.           byte 9    = decimal separator char
  4228.           byte 0Ah    = 00h
  4229.           byte 0Bh    = date separator char
  4230.           byte 0Ch    = 00h
  4231.           byte 0Dh    = time separator char
  4232.           byte 0Eh    = 00h
  4233.           byte 0Fh    = currency format
  4234.                bit 2 = set if currency symbol replaces decimal pt
  4235.                bit 1 = number of spaces between value and curr sym
  4236.                bit 0 = 0 if currency symbol precedes value
  4237.                    1 if currency symbol follows value
  4238.           byte 10h    = number of digits after decimal in currency
  4239.           byte 11h    = time format
  4240.                bit 0 = 0 if 12-hour clock
  4241.                    1 if 24-hour clock
  4242.           bytes 12h-15h = address of case map routine (FAR CALL, AL = char)
  4243.           byte 16h    = data-list separator char
  4244.           byte 17h    = 00h
  4245.           bytes 18h-21h reserved
  4246.       If error:
  4247.     CF set
  4248.     AX = error code
  4249. --------------------------------------------------
  4250. INT 21 - DOS 2+ - CREATE A SUBDIRECTORY (MKDIR)
  4251.     AH = 39h
  4252.     DS:DX = address of ASCIZ pathname
  4253. Return: CF set on error
  4254.         AX = Error Code
  4255. --------------------------------------------------
  4256. INT 21 - DOS 2+ - REMOVE A DIRECTORY ENTRY (RMDIR)
  4257.     AH = 3Ah
  4258.     DS:DX = address of ASCIZ pathname
  4259. Return: CF set on error
  4260.         AX = Error Code
  4261. --------------------------------------------------
  4262. INT 21 - DOS 2+ - CHANGE THE CURRENT DIRECTORY (CHDIR)
  4263.     AH = 3Bh
  4264.     DS:DX = address of ASCIZ directory name
  4265. Return: CF set on error
  4266.         AX = Error Code
  4267. --------------------------------------------------
  4268. INT 21 - DOS 2+ - CREATE A FILE WITH HANDLE (CREAT)
  4269.     AH = 3Ch
  4270.     CX = attributes for file
  4271.         bit 0: read-only
  4272.                 1: hidden
  4273.                 2: system
  4274.                 3: volume label
  4275.                 4: reserved, must be zero (directory)
  4276.                 5: archive bit
  4277.                 7: if set, file is shareable under Novell NetWare
  4278.     DS:DX = address of ASCIZ filename
  4279. Return: CF set on error
  4280.         AX = error code
  4281.     CF clear if successful
  4282.         AX = file handle
  4283. --------------------------------------------------
  4284. INT 21 - DOS 2+ - OPEN DISK FILE WITH HANDLE
  4285.     AH = 3Dh
  4286.     AL = access code
  4287.         0 = Read Only
  4288.         1 = Write Only
  4289.         2 = Read/Write
  4290.     AL bits 7-3 = file-sharing modes (DOS 3.x)
  4291.         bit 7    = inheritance flag, set for no inheritance
  4292.         bits 4-6 = sharing mode
  4293.               000 compatibility mode
  4294.               001 exclusive (deny all)
  4295.               010 write access denied (deny write)
  4296.               011 read access denied (deny read)
  4297.               100 full access permitted (deny none)
  4298.         bit 3    = reserved, should be zero
  4299.     DS:DX = address of ASCIZ filename
  4300. Return: CF set on error
  4301.         AX = error code
  4302.     CF clear if successful
  4303.         AX = file handle
  4304. --------------------------------------------------
  4305. INT 21 - DOS 2+ - CLOSE A FILE WITH HANDLE
  4306.     AH = 3Eh
  4307.     BX = file handle
  4308. Return: CF set on error
  4309.         AX = error code
  4310. --------------------------------------------------
  4311. INT 21 - DOS 2+ - READ FROM FILE WITH HANDLE
  4312.     AH = 3Fh
  4313.     BX = file handle
  4314.     CX = number of bytes to read
  4315.     DS:DX = address of buffer
  4316. Return: CF set on error
  4317.         AX = error code
  4318.     CF clear if successful
  4319.         AX = number of bytes read
  4320. --------------------------------------------------
  4321. INT 21 - DOS 2+ - WRITE TO FILE WITH HANDLE
  4322.     AH = 40h
  4323.     BX = file handle
  4324.     CX = number of bytes to write
  4325.     DS:DX -> buffer
  4326. Return: CF set on error
  4327.         AX = error code
  4328.     CF clear if successful
  4329.         AX = number of bytes written
  4330. Note: if CX is zero, no data is written, and the file is truncated or extended
  4331.       to the current position
  4332. --------------------------------------------------
  4333. INT 21 - DOS 2+ - DELETE A FILE (UNLINK)
  4334.     AH = 41h
  4335.     DS:DX -> ASCIZ name of file to delete
  4336. Return: CF set on error
  4337.         AX = error code
  4338. --------------------------------------------------
  4339. INT 21 - DOS 2+ - MOVE FILE READ/WRITE POINTER (LSEEK)
  4340.     AH = 42h
  4341.     AL = method value
  4342.         0 = offset from beginning of file
  4343.         1 = offset from present location
  4344.         2 = offset from end of file
  4345.     BX = file handle
  4346.     CX:DX = offset in bytes
  4347. Return: CF set on error
  4348.         AX = error code
  4349.     CF clear if successful
  4350.         DX:AX = new offset
  4351. --------------------------------------------------
  4352. INT 21 - DOS 2+ - GET/PUT FILE ATTRIBUTES (CHMOD)
  4353.     AH = 43h
  4354.     AL =
  4355.         0 = get file attributes
  4356.         1 = put file attributes
  4357.            CX = file attribute bits
  4358.            0 = read only
  4359.            1 = hidden file
  4360.            2 = system file
  4361.            3 = volume label
  4362.            4 = subdirectory
  4363.            5 = written since backup
  4364.            8 = shareable (Novell NetWare)
  4365.     DS:DX -> ASCIZ file name
  4366. Return: CF set on error
  4367.         AX = error code
  4368.     CX = file attributes on get
  4369. --------------------------------------------------
  4370. INT 21 - DOS 2+ - IOCTL - GET DEVICE INFORMATION
  4371.     AX = 4400h
  4372.     BX = file or device handle
  4373. Return: CF set on error
  4374.        AX = error code
  4375.     CF clear if successful
  4376.        DX = device info
  4377.        If bit 7 set: (character device)
  4378.            bit 0: console input device
  4379.            1: console output device
  4380.            2: NUL device
  4381.            3: CLOCK$ device
  4382.            4: device is special
  4383.            5: binary (raw) mode
  4384.            6: Not EOF
  4385.           12: network device (DOS 3.x)
  4386.           14: can process IOCTL control strings (func 2-5)
  4387.        If bit 7 clear: (file)
  4388.            bits 0-5 are block device number
  4389.            6: file has not been written
  4390.           12: Network device (DOS 3.x)
  4391.           15: file is remote (DOS 3.x)
  4392. --------------------------------------------------
  4393. INT 21 - DOS 2+ - IOCTL - SET DEVICE INFORMATION
  4394.     AX = 4401h
  4395.     BX = device handle
  4396.     DH = 0
  4397.     DL = device information to set (bits 0-7 from function 0)
  4398. Return: CF set on error
  4399.         AX = error code
  4400. --------------------------------------------------
  4401. INT 21 - DOS 2+ - IOCTL - READ CHARACTER DEVICE CONTROL STRING
  4402.     AX = 4402h
  4403.     BX = device handle
  4404.     CX = number of bytes to read
  4405.     DS:DX -> buffer
  4406. Return: CF set on error
  4407.         AX = error code
  4408.     CF clear if successful
  4409.         AX = number of bytes read
  4410. --------------------------------------------------
  4411. INT 21 - DOS 2+ - IOCTL - WRITE CHARACTER DEVICE CONTROL STRING
  4412.     AX = 4403h
  4413.     BX = device handle
  4414.     CX = number of bytes to write
  4415.     DS:DX -> buffer
  4416. Return: CF set on error
  4417.         AX = error code
  4418.     CF clear if successful
  4419.         AX = number of bytes written
  4420. --------------------------------------------------
  4421. INT 21 - DOS 2+ - IOCTL - READ BLOCK DEVICE CONTROL STRING
  4422.     AX = 4404h
  4423.     BL = drive number (0=default)
  4424.     CX = number of bytes to read
  4425.     DS:DX -> buffer
  4426. Return: CF set on error
  4427.        AX = error code
  4428.     CF clear if successful
  4429.        AX = number of bytes read
  4430. --------------------------------------------------
  4431. INT 21 - DOS 2+ - IOCTL - WRITE BLOCK DEVICE CONTROL STRING
  4432.     AX = 4405h
  4433.     BL = drive number (0=default)
  4434.     CX = number of bytes to write
  4435.     DS:DX -> buffer
  4436. Return: CF set on error
  4437.         AX = error code
  4438.     CF clear if successful
  4439.         AX = number of bytes written
  4440. --------------------------------------------------
  4441. INT 21 - DOS 2+ - IOCTL - GET INPUT STATUS
  4442.     AX = 4406h
  4443.     BX = file or device handle
  4444. Return: AL = FFh device ready
  4445.          00h device not ready
  4446. --------------------------------------------------
  4447. INT 21 - DOS 2+ - IOCTL - GET OUTPUT STATUS
  4448.     AX = 4407h
  4449.     BX = file or device handle
  4450. Return: AL = FFh device ready
  4451.          00h device not ready
  4452. Note: for DOS 2.x, files are always ready for output
  4453. --------------------------------------------------
  4454. INT 21 - DOS 3.x - IOCTL - BLOCK DEVICE CHANGEABLE
  4455.     AX = 4408h
  4456.     BL = drive number (0=default)
  4457. Return: AX = 00h removable
  4458.          01h fixed
  4459.          0Fh invalid drive
  4460. --------------------------------------------------
  4461. INT 21 - DOS 3.x - IOCTL - BLOCK DEVICE LOCAL
  4462.     AX = 4409h
  4463.     BL = drive number (0=default)
  4464. Return: DX = attribute word, bit 12 set if device is remote
  4465. --------------------------------------------------
  4466. INT 21 - DOS 3.x - IOCTL - HANDLE LOCAL
  4467.     AX = 440Ah
  4468.     BX = file handle
  4469. Return: DX = attribute word, bit 15 set if file is remote
  4470. Note:   if file is remote, Novell Advanced NetWare 2.0 returns the number of
  4471.     the file server on which the handle is located in CX
  4472. --------------------------------------------------
  4473. INT 21 - DOS 3.x - IOCTL - SET SHARING RETRY COUNT
  4474.     AX = 440Bh
  4475.     CX = delay (default 1)
  4476.     DX = retry count (default 3)
  4477. Return: CF set on error
  4478.         AX = error code
  4479. --------------------------------------------------
  4480. INT 21 - DOS 3.2 - IOCTL - GENERIC
  4481.     AX = 440Ch
  4482.     BX = device handle
  4483.     CH = category code
  4484.         00h unknown (DOS 3.3)
  4485.         01h COMn: (DOS 3.3)
  4486.         03h CON (DOS 3.3)
  4487.         05h LPTn:
  4488.     CL = function
  4489.         45h set iteration count
  4490.         4Ah select code page
  4491.         4Ch start code-page preparation
  4492.         4Dh end code-page preparation
  4493.         65h get iteration count
  4494.         6Ah query selected code page
  4495.         6Bh query prepare list
  4496.     DS:DX -> parameter block
  4497.         for CL=45h        WORD  iteration count
  4498.         for CL=4Ah,4Dh,6Ah    WORD  length of data
  4499.                 WORD  code page ID
  4500.         for CL=4Ch        WORD  flags
  4501.                 WORD  length of remainder of parameter block
  4502.                 WORD  number of code pages following
  4503.                   N WORDs code page 1,...,N
  4504.         for CL=6Bh        WORD  length of following data
  4505.                 WORD  number of hardware code pages
  4506.                   N WORDs hardware code pages 1,...,N
  4507.                 WORD  number of prepared code pages
  4508.                   N WORDs prepared code pages 1,...,N
  4509. Return: CF set on error
  4510.         AX = error code
  4511. --------------------------------------------------
  4512. INT 21 - DOS 3.2 - IOCTL - BLOCK DEVICE REQUEST
  4513.     AX = 440Dh
  4514.     BL = drive number (0=default)
  4515.     CH = category code
  4516.         08h disk drive
  4517.     CL = function
  4518.          40h set device parameters
  4519.         41h write logical device track
  4520.         42h format and verify logical device track
  4521.         60h get device parameters
  4522.         61h read logical device track
  4523.         62h verify logical device track
  4524.     DS:DX -> parameter block
  4525.     for functions 40h, 60h
  4526.         BYTE  special functions
  4527.         bit 0 set if function to use current BPB, clear if Device BIOS
  4528.             Parameter Block field contains new default BPB
  4529.         bit 1 set if function to use track layout fields only
  4530.             must be clear if CL=60h
  4531.         bit 2 set if all sectors in track same size (should be set)
  4532.         bits 3-7 reserved
  4533.         BYTE  device type
  4534.         00h  320K/360K disk
  4535.         01h  1.2M disk
  4536.         02h  720K disk
  4537.         03h  single-density 8-inch disk
  4538.         04h  double-density 8-inch disk
  4539.         05h  fixed disk
  4540.         06h  tape drive
  4541.         07h  other type of block device
  4542.         WORD  device attributes
  4543.         bit 0 set if nonremovable medium
  4544.         bit 1 set if door lock supported
  4545.         bits 2-15 reserved
  4546.         WORD  number of cylinders
  4547.         BYTE  media type
  4548.         00h 1.2M disk (default)
  4549.         01h 320K/360K disk
  4550.      31 BYTEs device BPB (see function 53h)
  4551.         WORD  number of sectors per track (start of track layout field)
  4552.       N word pairs: number,size of each sector in track
  4553.     for functions 41h, 61h
  4554.         BYTE  reserved, must be zero
  4555.         WORD  number of disk head
  4556.         WORD  number of disk cylinder
  4557.         WORD  number of first sector to read/write
  4558.         WORD  number of sectors
  4559.         DWORD transfer address
  4560.     for functions 42h, 62h
  4561.         BYTE  reserved, must be zero
  4562.         WORD  number of disk head
  4563.         WORD  number of disk cylinder
  4564. Return: CF set on error
  4565.        AX = error code
  4566. --------------------------------------------------
  4567. INT 21 - DOS 3.2 - IOCTL - GET LOGICAL DRIVE MAP
  4568.     AX = 440Eh
  4569.     BL = drive number (0=default)
  4570. Return: CF set on error
  4571.         AX = error code
  4572.     CF clear if successful
  4573.         AL = 0 block device has only one logical drive assigned
  4574.          1..26 the last letter used to reference the drive (1=A:,etc)
  4575. --------------------------------------------------
  4576. INT 21 - DOS 3.2 - IOCTL - SET LOGICAL DRIVE MAP
  4577.     AX = 440Fh
  4578.     BL = physical drive number (0=default)
  4579. Return: CF set on error
  4580.         AX = error code
  4581. Note: maps logical drives to physical drives, similar to DOS's treatment of
  4582.     a single physical floppy drive as both A: and B:
  4583. --------------------------------------------------
  4584. INT 21 - DOS 2+ - CREATE DUPLICATE HANDLE (DUP)
  4585.     AH = 45h
  4586.     BX = file handle to duplicate
  4587. Return: CF set on error
  4588.         AX = error code
  4589.     CF clear if successful
  4590.         AX = new file handle
  4591. --------------------------------------------------
  4592. INT 21 - DOS 2+ - FORCE DUPLICATE HANDLE (FORCDUP,DUP2)
  4593.     AH = 46h
  4594.     BX = Existing file handle
  4595.     CX = new file handle
  4596. Return: CF set on error
  4597.         AX = error code
  4598. --------------------------------------------------
  4599. INT 21 - DOS 2+ - GET CURRENT DIRECTORY
  4600.     AH = 47h
  4601.     DL = drive (0=default, 1=A, etc.)
  4602.     DS:SI points to 64-byte buffer area
  4603. Return: CF set on error
  4604.         AX = error code
  4605. Note: the returned path does not include the initial backslash
  4606. --------------------------------------------------
  4607. INT 21 - DOS 2+ - ALLOCATE MEMORY
  4608.     AH = 48h
  4609.     BX = number of 16-byte paragraphs desired
  4610. Return: CF set on error
  4611.         AX = error code
  4612.         BX = maximum available
  4613.     CF clear if successful
  4614.         AX = segment of allocated memory block
  4615. --------------------------------------------------
  4616. INT 21 - DOS 2+ - FREE MEMORY
  4617.     AH = 49h
  4618.     ES = Segment address of area to be freed
  4619. Return: CF set on error
  4620.         AX = error code
  4621. --------------------------------------------------
  4622. INT 21 - DOS 2+ - ADJUST MEMORY BLOCK SIZE (SETBLOCK)
  4623.     AH = 4Ah
  4624.     ES = Segment address of block to change
  4625.     BX = New size in paragraphs
  4626. Return: CF set on error
  4627.         AX = error code
  4628.         BX = maximum size possible for the block
  4629. --------------------------------------------------
  4630. INT 21 - DOS 2+ - LOAD OR EXECUTE (EXEC)
  4631.     AH = 4Bh
  4632.     AL = subfunction
  4633.         0 = load and execute program
  4634.         1 = load but do not execute (internal, DOS 3.x & DESQview only)
  4635.         2 = load but do not execute (internal, DOS 2.x only)
  4636.         3 = load overlay; do not create PSP
  4637.     DS:DX = filename
  4638.     ES:BX = parameter block
  4639.            AL =
  4640.           0: WORD segment of environment (0 = use current)
  4641.              DWORD -> command line
  4642.              DWORD -> FCB 1
  4643.              DWORD -> FCB 2
  4644.           1: WORD segment of environment (0 = use current)
  4645.              DWORD -> command line
  4646.              DWORD -> FCB 1
  4647.              DWORD -> FCB 2
  4648.              DWORD will hold SS:SP on return
  4649.              DWORD will hold program entry point (CS:IP) on return
  4650.           2: WORD segment of environment (0 = use current)
  4651.              DWORD -> command line
  4652.              DWORD -> FCB 1
  4653.              DWORD -> FCB 2
  4654.           3: WORD segment load address
  4655.              WORD segment relocation factor
  4656. Return: CF set on error
  4657.         AX = error code
  4658.     CF clear if successful
  4659.         if function 1, process ID set to new program's PSP; get with
  4660.         function 62h
  4661.         if function 2, new program's initial stack and entry point
  4662.         returned in registers
  4663. Note: DOS 2.x destroys all registers, including SS:SP
  4664.  
  4665. Structure of .EXE file header:
  4666.     WORD  0x4d, 0x5a signature (sometimes 5Ah, 4Dh)
  4667.     WORD  image size remainder (program size mod 512)
  4668.     WORD  file size in pages (program size div 512) 
  4669.     WORD  number of relocation items
  4670.     WORD  header size in paragraphs
  4671.     WORD  minimum extra paragraphs needed
  4672.     WORD  maximum extra paragraphs needed
  4673.     WORD  stack segment
  4674.     WORD  stack offset
  4675.     WORD  word checksum of entire file
  4676.     DWORD initial CS:IP
  4677.     WORD  offset of relocation table 
  4678.     WORD  overlay number
  4679. --------------------------------------------------
  4680. INT 21 - DOS 2+ - QUIT WITH EXIT CODE (EXIT)
  4681.     AH = 4Ch
  4682.     AL = exit code
  4683. Return: never returns
  4684. --------------------------------------------------
  4685. INT 21 - DOS 2+ - GET EXIT CODE OF SUBPROGRAM (WAIT)
  4686.     AH = 4Dh
  4687. Return: AL = exit code of subprogram (functions 31h or 4Ch)
  4688.     AH = circumstance which caused termination
  4689.         0 = Terminate/abort
  4690.         1 = Control-C
  4691.         2 = Hard error
  4692.         3 = Terminate and stay resident
  4693. --------------------------------------------------
  4694. INT 21 - DOS 2+ - FIND FIRST ASCIZ (FIND FIRST)
  4695.     AH = 4Eh
  4696.     CX = search attributes
  4697.     DS:DX -> ASCIZ filename
  4698. Return: CF set on error
  4699.         AX = error code
  4700.     [DTA] = data block
  4701.           undocumented fields
  4702.           PC-DOS 3.10
  4703.              byte  00h:     drive letter
  4704.              bytes 01h-0Bh: search template
  4705.              byte  0Ch:     search attributes
  4706.           DOS 2.x (and DOS 3.x except 3.1???)
  4707.              byte  00h:     search attributes
  4708.              byte  01h:     drive letter
  4709.              bytes 02h-0Ch: search template
  4710.           bytes 0Dh-0Eh: entry count within directory
  4711.           bytes 0Fh-12h: reserved
  4712.           bytes 13h-14h: cluster number of parent directory
  4713.           byte  15h:     attribute of file found
  4714.           bytes 16h-17h: file time
  4715.           bytes 18h-19h: file date
  4716.           bytes 1Ah-1Dh: file size
  4717.           bytes 1Eh-3Ah: ASCIZ filename+extension
  4718. --------------------------------------------------
  4719. INT 21 - DOS 2+ - FIND NEXT ASCIZ (FIND NEXT)
  4720.     AH = 4Fh
  4721.     [DTA] = data block from last AH = 4Eh/4Fh call
  4722. Return: CF set on error
  4723.         AX = error code
  4724.     [DTA] = data block, see AH = 4Eh above
  4725. --------------------------------------------------
  4726. INT 21 - DOS Internal - SET PSP SEGMENT
  4727.     AH = 50h
  4728.     BX = Segment address of new PSP
  4729. Note: under DOS 2.xx, this function cannot be invoked inside an INT 28h handler
  4730.       without setting the Critical Error flag
  4731. --------------------------------------------------
  4732. INT 21 - DOS Internal - GET PSP SEGMENT
  4733.     AH = 51h
  4734. Return: BX = Current PSP Segment
  4735. Note: under DOS 2.xx, this function cannot be invoked inside an INT 28h handler
  4736.       without setting the Critical Error flag
  4737.  
  4738. Structure of PSP:
  4739.  00h  2 BYTEs program exit point
  4740.  02h      WORD  memory size in paragraphs
  4741.  04h    BYTE  unused
  4742.  05h  5 BYTEs CP/M entry point
  4743.  0Ah    DWORD terminate address (old INT 22h)
  4744.  0Eh    DWORD break address (old INT 23h)
  4745.  12h    DWORD critical error handler (old INT 24h)
  4746.  16h    WORD  parent PSP segment
  4747.  18h 20 BYTEs DOS 2+ open file table, FFh = unused
  4748.  2Ch    WORD  DOS 2+ environment segment
  4749.  2Eh    DWORD process's SS:SP
  4750.  32h    WORD  DOS 3.x max open files
  4751.  36h    DWORD DOS 3.x open file table address
  4752.  38h 24 BYTEs unused by DOS versions <= 3.3
  4753.  50h  3 BYTEs DOS function dispatcher (FAR routine)
  4754.  53h  9 BYTEs unused
  4755.  5Ch 16 BYTEs FCB #1, filled in from first commandline argument
  4756.  6Ch 20 BYTEs FCB #2, filled in from second commandline argument
  4757.  80h 128 BYTEs command tail / default DTA buffer
  4758. --------------------------------------------------
  4759. INT 21 - DOS Internal - GET LIST OF LISTS
  4760.     AH = 52h
  4761. Return: ES:BX points to DOS list of lists
  4762.  
  4763. List of Lists:
  4764. Bytes    Value
  4765. -2&-1    Segment of first memory control block
  4766. 00h-03h Pointer to first DOS Device Control Block (see function 32h)
  4767. 04h-07h Pointer to list of DOS file tables
  4768.     DWORD pointer to next file table
  4769.     WORD  number of files in this table
  4770.     35h bytes per file
  4771.       00h-01h number of file handles referring to this file
  4772.       02h      access mode (see function 3Dh)
  4773.       03h-04h ???
  4774.       05h-06h device info word (see function 44h/AL=00h)
  4775.       07h-0Ah Pointer to device driver header if character device
  4776.           Pointer to DOS Device Control Block if block device (see
  4777.           func 32h for format)
  4778.       0Bh-0Ch starting cluster of file
  4779.       0Dh-0Eh file time in packed format
  4780.       0Fh-10h file date in packed format
  4781.       11h-14h file size
  4782.       15h-18h current offset in file
  4783.       19h-1Ah ???
  4784.       1Bh-1Ch last cluster read
  4785.       1Dh-1Fh ???
  4786.       20h-2Ah filename in FCB format (no path, no period, blank-padded)
  4787.       2Bh-30h unused??? I see 0 always
  4788.       31h-32h PSP segment of file's owner
  4789.       33h-34h unused??? I see 0 always
  4790. 08h-0Bh Pointer to CLOCK$ device driver, whether installable or resident
  4791. 0Ch-0Fh Pointer to actual CON: device driver, whether installable or resident
  4792. -----DOS 2.x
  4793. 10h    Number of logical drives in system
  4794. 11h-12h Maximum bytes/block of any block device
  4795. 13h-16h pointer to first disk buffer
  4796.     10h bytes control info followed by the 512-byte buffer
  4797.       00h-03h pointer to next disk buffer, FFFFh if last
  4798.       04h-07h ???
  4799.       08h-09h logical sector number
  4800.       0Ah-0Bh ???
  4801.       0Ch-0Fh pointer to DOS Device Control Block (see function 32h)
  4802. 17h    Beginning (not a pointer--the real beginning!) of NUL device driver.
  4803.     This is the first device on DOS's linked list of device drivers.
  4804. -----DOS 3.x
  4805. 10h-11h Maximum bytes/block of any block device
  4806. 12h-15h Pointer to first disk buffer
  4807.     10h bytes control info per disk buffer, followed by 512-byte buffer
  4808.       00h-03h pointer to next disk buffer, FFFFh if last
  4809.       04h      drive (0=A:)
  4810.       05h      flags
  4811.         bit 7: ???
  4812.         bit 6: ???
  4813.         bit 5: contents may be overwritten if set (buffer not dirty)
  4814.         bit 4: ???
  4815.         bit 3: sector in data area
  4816.         bit 2: sector in root directory
  4817.         bit 1: sector in FAT
  4818.         bit 0: ???
  4819.       06h-07h logical sector number
  4820.       08h      ???
  4821.       09h      ???
  4822.       0Ah-0Dh pointer to DOS Device Control Block (see function 32h)
  4823.       0Eh-0Fh unused??? (almost always 0)
  4824. 16h-19h Pointer to array of drive info:
  4825.     51h bytes per drive, starting with A: ...
  4826.       00h-3Fh Current path as ASCIZ, starting with 'x:\'
  4827.       40h-43h ??? I see zeros always
  4828.       44h      ??? I see 40h always
  4829.       45h-48h pointer to DOS Disk Block for this drive
  4830.       49h-4Ah starting cluster of current dir, 0 = root, -1 never accessed
  4831.       4Bh-4Ch ??? I see FFFFh always
  4832.           4Dh-4Eh ??? I see FFFFh always
  4833.       4Fh-50h ??? I see 2 always
  4834. 1Ah-1Dh Pointer to FCB table (if CONFIG.SYS contains FCBS=)
  4835. 1Eh-1Fh Size of FCB table
  4836. 20h    Number of block devices
  4837. 21h    Value of LASTDRIVE command in CONFIG.SYS (default 5)
  4838. 22h    Beginning (not a pointer--the real beginning!) of NUL device driver.
  4839.     This is the first device on DOS's linked list of device drivers.
  4840.     Device driver header format:
  4841.       DWORD pointer to next driver or -1 if last driver
  4842.       WORD    device attributes
  4843.         bit 15    character device
  4844.         bit 14    IOCTL supported
  4845.         bit 13    output until busy
  4846.         bit 12    reserved
  4847.         bit 11    OPEN/CLOSE/RM calls supported
  4848.         bit 10-5 reserved
  4849.         bit 4    device is special
  4850.         bit 3    device is CLOCK
  4851.         bit 2    device is NUL
  4852.         bit 1    device is standard output
  4853.         bit 0    device is standard input
  4854.       WORD    device strategy entry point
  4855.       WORD    device interrupt entry point
  4856.     8 BYTEs blank-padded character device name
  4857.       WORD    0 (CD-ROM driver)
  4858.       BYTE    drive letter (CD-ROM driver)
  4859.       BYTE    number of units (CD-ROM driver)
  4860. --------------------------------------------------
  4861. INT 21 - DOS Internal - TRANSLATE BPB
  4862.     AH = 53h
  4863.     DS:SI points to BPB (Bios Parameter Block)
  4864.     ES:BP points to area for DOS Disk Block
  4865. Note:    Translates BPB (Bios Parameter Block, see below) into a DOS Disk Block
  4866.     (see function 32h).
  4867. BPB structure:
  4868.     WORD  bytes/sector. Get from DDB bytes 2-3.
  4869.     BYTE  sectors/cluster. Get from (DDB byte 4) + 1
  4870.     WORD  reserved sectors. Get from DDB bytes 6-7
  4871.     BYTE  number of FATs. Get from DDB byte 8
  4872.     WORD  number of root dir entries. Get from DDB bytes 09h-0Ah
  4873.     WORD  total number of sectors. Get from:
  4874.     ((DDB bytes D-E) - 1) * (sectors per cluster (BPB byte 2))
  4875.       + (DDB Bytes B-C)
  4876.     BYTE  media descriptor byte. Get from DDB byte 16h
  4877.     WORD  number of sectors/FAT. Get from DDB byte 0Fh
  4878. ---DOS 3.x---
  4879.     WORD  number of sectors per track
  4880.     WORD  number of heads
  4881.     DWORD number of hidden sectors
  4882.      11 BYTEs reserved    
  4883. --------------------------------------------------
  4884. INT 21 - DOS 2+ - GET VERIFY FLAG
  4885.     AH = 54h
  4886. Return: AL = 0 if flag OFF
  4887.     AL = 1 if flag ON
  4888. --------------------------------------------------
  4889. INT 21 - DOS Internal - CREATE PSP
  4890.     AH = 55h
  4891.     DX = segment number at which to set up PSP
  4892. Note: Like func 26h but creates "child" PSP rather than copying existing one.
  4893. --------------------------------------------------
  4894. INT 21 - DOS 2+ - RENAME A FILE
  4895.     AH = 56h
  4896.     DS:DX -> ASCIZ old name
  4897.     ES:DI -> ASCIZ new name
  4898. Return: CF set on error
  4899.         AX = error code
  4900. Note: allows move between directories on same logical volume
  4901.       (DOS 3.x) allows renaming of directories
  4902. --------------------------------------------------
  4903. INT 21 - DOS 2+ - GET/SET FILE'S DATE/TIME
  4904.     AH = 57h
  4905.     AL = function code
  4906.         00h get date and time
  4907.            Return: CX = time of last write
  4908.                DX = date of last write
  4909.         01h set date and time
  4910.            CX = time to be set
  4911.            DX = date to be set
  4912.     BX = file handle
  4913. Return: CF set on error
  4914.         AX = error code
  4915. --------------------------------------------------
  4916. INT 21 - DOS 3.x - GET/SET MEMORY ALLOCATION STRATEGY
  4917.     AH = 58h
  4918.     AL = function code
  4919.         0 = get allocation strategy
  4920.         1 = set allocation strategy
  4921.            BL = strategy code
  4922.            0 first fit (use first memory block large enough)
  4923.            1 best fit (use smallest memory block large enough)
  4924.            2 last fit (use high part of last usable memory block)
  4925. Return: CF set on error
  4926.         AX = error code
  4927.     CF clear if successful
  4928.         AX = strategy code
  4929. Note: the Set subfunction accepts any value in BL; 2 or greater means last fit.
  4930.       the Get subfunction returns the last value set, so programs should check
  4931.       whether the value is >= 2, not just equal to 2.
  4932. --------------------------------------------------
  4933. INT 21 - DOS 3.x - GET EXTENDED ERROR CODE
  4934.     AH = 59h
  4935.     BX = version code (0000 for DOS 3.x)
  4936. Return: AX = extended error code
  4937.     BH = class of error
  4938.     BL = suggested action code
  4939.     CH = locus (where error occurred)
  4940.     CL, DX, SI, DI, BP, DS, and ES destroyed
  4941.  
  4942. Error codes:
  4943.     01h function number invalid
  4944.     02h file not found
  4945.     03h path not found
  4946.     04h too many open files (no handles available)
  4947.     05h access denied
  4948.     06h invalid handle
  4949.     07h memory control block destroyed
  4950.     08h insufficient memory
  4951.     09h memory block address invalid
  4952.     0Ah environment invalid
  4953.     0Bh format invalid
  4954.     0Ch access code invalid
  4955.     0Dh data invalid
  4956.     0Fh invalid drive
  4957.     10h attempted to remove current directory
  4958.     11h not same device
  4959.     12h no more files
  4960.     13h disk write-protected
  4961.     14h unknown unit
  4962.     15h drive not ready
  4963.     16h unknown command
  4964.     17h data error (CRC)
  4965.     18h bad request structure length
  4966.     19h seek error
  4967.     1Ah unknwon media type (non-DOS disk)
  4968.     1Bh sector not found
  4969.     1Ch printer out of paper
  4970.     1Dh write fault
  4971.     1Eh read fault
  4972.     1Fh general failure
  4973.     20h sharing violation
  4974.     21h lock violation
  4975.     22h disk change invalid
  4976.         ES:DI -> ASCIZ volume label of required disk
  4977.     23h FCB unavailable
  4978.     24h sharing buffer overflow
  4979.     25h-31h reserved
  4980.     32h Network request not supported (DOS 3.1 + MS Networks)
  4981.     33h Remote computer not listening
  4982.     34h Duplicate name on network
  4983.     35h Network name not found
  4984.     36h Network busy
  4985.     37h Network device no longer exists
  4986.     38h Network BIOS command limit exceeded
  4987.     39h Network adapter hardware error
  4988.     3Ah Incorrect response from network
  4989.     3Bh Unexpected network error
  4990.     3Ch Incompatible remote adapter
  4991.     3Dh Print queue full
  4992.     3Eh Queue not full
  4993.     3Fh Not enough space to print file
  4994.     40h Network name was deleted
  4995.     41h Network: Access denied
  4996.     42h Network device type incorrect
  4997.     43h Network name not found
  4998.     44h Network name limit exceeded
  4999.     45h Network BIOS session limit exceeded
  5000.     46h Temporarily paused
  5001.     47h Network request not accepted
  5002.     48h Print/disk redirection paused (DOS 3.1 + MS Networks)
  5003.     49h-4Fh reserved
  5004.     50h file exists
  5005.     51h reserved
  5006.     52h cannot make directory
  5007.     53h fail on INT 24h
  5008.     54h (DOS 3.3) too many redirections
  5009.     55h (DOS 3.3) duplicate redirection
  5010.     56h (DOS 3.3) invalid password
  5011.     57h (DOS 3.3) invalid parameter
  5012.     58h (DOS 3.3) network write fault
  5013. Error Classes:
  5014.     01h out of resource (storage space or I/O channels)
  5015.     02h temporary situation (file or record lock)
  5016.     03h authorization (denied access)
  5017.     04h internal (system software bug)
  5018.     05h hardware failure
  5019.     06h system failure (configuration file missing or incorrect)
  5020.     07h application program error
  5021.     08h not found
  5022.     09h bad format
  5023.     0Ah locked
  5024.     0Bh media error
  5025.     0Ch already exists
  5026.     0Dh unknown
  5027. Suggested Action:
  5028.     01h retry
  5029.     02h delayed retry
  5030.     03h prompt user to reenter input
  5031.     04h abort after cleanup
  5032.     05h immediate abort
  5033.     06h ignore
  5034.     07h retry after user intervention
  5035. Error Locus:
  5036.     01h unknown or not appropriate
  5037.     02h block device (disk error)
  5038.     03h network related
  5039.     04h serial device (timeout)
  5040.     05h memory related
  5041. --------------------------------------------------
  5042. INT 21 - DOS 3.x - CREATE UNIQUE FILE
  5043.     AH = 5Ah
  5044.     DS:DX -> ASCIZ directory path name ending with a '\' + 13 bytes to
  5045.          receive generated filename
  5046.     CX = file attribute
  5047. Return: CF set on error
  5048.         AX = error code
  5049.     CF clear if successful
  5050.         AX = file handle
  5051.     DS:DX -> path name
  5052. Note: The file created is not truly "temporary".  It MUST be removed by the
  5053.       user.
  5054. --------------------------------------------------
  5055. INT 21 - DOS 3.x - CREATE NEW FILE
  5056.     AH = 5Bh
  5057.     DS:DX -> ASCIZ directory path name
  5058.     CX = file attribute
  5059. Return: CF set on error
  5060.         AX = error code
  5061.     CF clear if successful
  5062.     DS:DX -> path name
  5063. Note: Unlike function 3Ch, function 5Bh will fail if the file already exists.
  5064. --------------------------------------------------
  5065. INT 21 - DOS 3.x - LOCK/UNLOCK FILE ACCESS
  5066.     AH = 5Ch
  5067.     AL = 0 if lock
  5068.          1 if unlock
  5069.     BX = file handle
  5070.     CX:DX = starting offset of region to lock
  5071.     SI:DI = size of region to lock
  5072. Return: CF set on error
  5073.         AX = error code
  5074. --------------------------------------------------
  5075. INT 21 - DOS 3.x Internal - GET ADDRESS OF CRITICAL ERROR FLAG
  5076.     AX = 5D06h
  5077. Return: DS:SI -> critical error flag
  5078.     CX = ???
  5079.     DX = ???
  5080. Notes:    this call also does a lot of other work in addition to returning the
  5081.     pointer
  5082.     setting CritErr flag allows use of functions 50h/51h from INT 28h under
  5083.     DOS 2.x by forcing use of correct stack
  5084. --------------------------------------------------
  5085. INT 21 - DOS 3.x Internal - ???
  5086.     AH = 5Dh
  5087.     AL = subfunction
  5088.          07h: ???
  5089.          08h: (used by COMMAND.COM)
  5090.          09h: (used by COMMAND.COM)
  5091. --------------------------------------------------
  5092. INT 21 - DOS 3.1+ internal - SET EXTENDED ERROR INFORMATION
  5093.     AX = 5D0Ah
  5094.     DS:DX = address of 11-word error information
  5095.            words 0 to 7: values of AX,BX,CX,DX,SI,DI,DS,ES that func 59h
  5096.                  will return
  5097.            words 8 to 10: zero (reserved)
  5098. --------------------------------------------------
  5099. INT 21 - DOS 3.1 + Microsoft Networks - GET MACHINE NAME
  5100.     AX = 5E00h
  5101.     DS:DX -> buffer for ASCIZ name (16 bytes)
  5102. Return: CF set on error
  5103.         AX = error code
  5104.     CH = 0 if name not defined
  5105.     CL = NETBIOS name number
  5106.     DS:DX -> ASCIZ machine name if CH <> 0
  5107. --------------------------------------------------
  5108. INT 21 - DOS 3.1 + Microsoft Networks - SET MACHINE NAME
  5109.     AX = 5E01h
  5110.     DS:DX -> ASCIZ name
  5111.     CL = name number
  5112.     CH = ???
  5113. --------------------------------------------------
  5114. INT 21 - DOS 3.1 + Microsoft Networks - SET PRINTER SETUP
  5115.     AX = 5E02h
  5116.     BX = Redirection list index
  5117.     CX = length of setup string (<= 64)
  5118.     DS:SI -> string buffer
  5119. Return: CF set on error
  5120.         AX = error code
  5121. --------------------------------------------------
  5122. INT 21 - DOS 3.1 + Microsoft Networks - GET PRINTER SETUP
  5123.     AX = 5E03h
  5124.     BX = Redirection list index
  5125.     ES:DI -> string buffer
  5126. Return: CF set on error
  5127.         AX = error code
  5128.     CX = length of setup string (<= 64)
  5129. --------------------------------------------------
  5130. INT 21 - DOS 3.1 + Microsoft Networks - GET REDIRECTION LIST ENTRY
  5131.     AX = 5F02h
  5132.     BX = Redirection list index
  5133.     DS:SI -> 16 char local device name buffer
  5134.     ES:DI -> 128 char network name buffer
  5135. Return: CF set on error
  5136.         AX = error code
  5137.     BH = Device status flag (BIT 0 = 0 if valid)
  5138.     BL = device type (03 if printer, 04 if drive)
  5139.     CX = stored parameter value (user data)
  5140. Note: DX and BP are destroyed by this call!
  5141. --------------------------------------------------
  5142. INT 21 - DOS 3.1 + Microsoft Networks - REDIRECT DEVICE
  5143.     AX = 5F03h
  5144.     BL = device type
  5145.         03 = printer device
  5146.         04 = file device
  5147.     CX = stored parameter value
  5148.     DS:SI -> ASCIZ source device name
  5149.     ES:DI -> destination ASCIZ network path + ASCIZ password
  5150. Return: CF set on error
  5151.         AX = error code
  5152. --------------------------------------------------
  5153. INT 21 - DOS 3.1 + Microsoft Networks - CANCEL REDIRECTION
  5154.     AX = 5F04h
  5155.     DS:SI -> ASCIZ device name or network path
  5156. Return: CF set on error
  5157.         AX = error code
  5158. --------------------------------------------------
  5159. INT 21 - DOS 3.x Internal - RESOLVE PATH STRING TO FULLY QUALIFIED PATH STRING
  5160.     AH = 60h
  5161.     DS:SI = relative path string
  5162.     ES:DI = buffer for fully qualified name
  5163. Return: buffer filled with qualified name; may return error code, unknown.
  5164. --------------------------------------------------
  5165. INT 21 - DOS 3.x Internal - UNUSED
  5166.     AH = 61h
  5167. Return: AL = 0
  5168. --------------------------------------------------
  5169. INT 21 - DOS 3.x - GET PSP ADDRESS
  5170.     AH = 62h
  5171. Return: BX = segment address of PSP
  5172. --------------------------------------------------
  5173. INT 21 - DOS 2.25 only - GET LEAD BYTE TABLE
  5174.     AH = 63h
  5175.     AL = subfunction
  5176.          0 = get system lead byte table
  5177.          1 = set/clear interim console flag
  5178.         DL = 1/0 to set/clear interim console flag
  5179.          2 = get interim console flag
  5180. Return: CF set on error
  5181.         AX = error code
  5182.     DS:SI -> lead byte table (AL = 0)
  5183.     DL = interim console flag (AL = 2)
  5184. Note: does not preserve any registers other than SS:SP
  5185. --------------------------------------------------
  5186. INT 21 - DOS 3.2 Internal - ???
  5187.     AH = 64h
  5188.     AL = subfunction
  5189.         00h get ???
  5190.         Return: DL = ???
  5191.         01h set ???
  5192.         DL = ???
  5193.         02h get and set ???
  5194.         DL = new ???
  5195.         Return: DL = old ???
  5196. --------------------------------------------------
  5197. INT 21 - DOS 3.3 - GET EXTENDED COUNTRY INFORMATION
  5198.     AH = 65h
  5199.     AL = info ID
  5200.         01h get general internationalization info
  5201.         02h get pointer to uppercase table
  5202.         04h get pointer to filename uppercase table
  5203.         06h get poiner to collating sequence table
  5204.     BX = code page (-1=global code page)
  5205.     DX = country ID (-1=current country)
  5206.     ES:DI -> country information buffer
  5207.     CX = size of buffer (>= 5)
  5208. Return: CF set on error
  5209.         AX = error code
  5210.     CF clear if succesful
  5211.         CX = size of country information returned
  5212.         ES:DI -> country information:
  5213.         BYTE  info ID
  5214.         if info ID == 1
  5215.             WORD  size
  5216.             WORD  country ID
  5217.             WORD  code page
  5218.          34 BYTEs see function 38h
  5219.         if info ID == 2
  5220.             DWORD pointer to uppercase table
  5221.               WORD    table size
  5222.               128 BYTEs uppercase equivalents (if any) of chars 80h-FFh
  5223.         if info ID == 4
  5224.             DWORD pointer to collating table
  5225.                 WORD    table size
  5226.               256 BYTEs values used to sort characters 00h-FFh
  5227.         if info ID == 6
  5228.             DWORD pointer to filename uppercase table
  5229.               WORD    table size
  5230.               128 BYTEs uppercase equivalents (if any) of chars 80h-FFh
  5231. --------------------------------------------------
  5232. INT 21 - DOS 3.3 - GET/SET GLOBAL CODE PAGE TABLE
  5233.     AH = 66h
  5234.     AL = 01h get global code page
  5235.          Return: AX = error code if carry flag set
  5236.              BX = active code page
  5237.              DX = system code page
  5238.        = 02h set global page
  5239.          BX = active code page
  5240.          437  US
  5241.          850  Multilingual
  5242.          860  Portugal
  5243.          863  Canada (French)
  5244.          865  Norway/Denmark
  5245.          DX = system code page (active page at boot time)
  5246.          Return: AX = error code if carry flag set
  5247. --------------------------------------------------
  5248. INT 21 - DOS 3.3 - SET HANDLE COUNT
  5249.     AH = 67h
  5250.     BX = desired number of handles (max 255)
  5251. Return: Carry set if error (and error code in AX)
  5252. --------------------------------------------------
  5253. INT 21 - DOS 3.3 - COMMIT FILE, WRITE ALL BUFFERED DATA TO DISK
  5254.     AH = 68h
  5255.     BX = file handle
  5256. Return: carry flag set on error (and error code in AX)
  5257. Note: if BX <= 20, no action is taken
  5258. --------------------------------------------------
  5259. INT 21 - DOS 4.0 - EXTENDED OPEN/CREATE
  5260.     AX = 6C00h
  5261.     BL = open mode as in AL for normal open
  5262.     BH = 0WF00000
  5263.         W = auto commit on write
  5264.         F = return error rather than doing INT 24h
  5265.     CX = create attribute
  5266.     DL = action if file exists/does not exists
  5267.         bits 7-4 action if file does not exist
  5268.             0000 fail
  5269.             0001 create
  5270.         bits 3-0 action if file exists
  5271.             0000 fail
  5272.             0001 open
  5273.             0010 replace/open
  5274.     DH = 0
  5275.     DS:SI -> ASCIZ file name
  5276. Return: CF set on error
  5277.        AX = error code
  5278.     CF clear if successful
  5279.        AX = file handle
  5280.        CX = 1 file opened
  5281.         2 file created
  5282.         3 file replaced
  5283. --------------------------------------------------
  5284. INT 21 - Novell NetWare SFT Level II - EXTENDED FILE ATTRIBUTES
  5285.     AH = B6h
  5286.     AL = subfunction
  5287.         00h get extended file attributes
  5288.         01h set extended file attributes
  5289.     CL = attributes
  5290.         bit 4: transaction tracking file
  5291.         5: indexing file (to be implemented)
  5292.             6: read audit (to be implemented)
  5293.             7: write audit (to be implemented)
  5294.     DS:DX -> ASCIZ pathname
  5295. Return: CF set on error
  5296.         AL = error code
  5297.         FFh file not found
  5298.         8Ch caller lacks privileges
  5299.     CL = current extended file attributes
  5300. --------------------------------------------------
  5301. INT 21 - Novell Advanced NetWare 2.0+ - PRINT JOBS
  5302.     AH = B8h
  5303.     AL = subfunction
  5304.         00h get default print job flags
  5305.         01h set default capture flags
  5306.         02h get specific capture flags
  5307.         03h set specific print job flags
  5308.         04h get default local printer
  5309.         05h set default local printer
  5310.         06h set capture print queue
  5311.         07h set capture print job
  5312.         08h get banner user name
  5313.         09h set banner user name
  5314.     CX = buffer size
  5315.     ES:BX -> buffer
  5316. Return: none
  5317. --------------------------------------------------
  5318. INT 21 - Novell NetWare 4.0 - SET END OF JOB STATUS
  5319.     AH = BBh
  5320.     AL = new EOJ flag
  5321.         00h disable EOJs
  5322.         otherwise enable EOJs
  5323. Return: AL = old EOJ flag
  5324. --------------------------------------------------
  5325. INT 21 - Novell NetWare 4.6 - LOG PHYSICAL RECORD
  5326.     AH = BCh
  5327.     AL = flags
  5328.         bit 0: lock as well as log record
  5329.             1: non-exclusive lock
  5330.     BX = file handle
  5331.     CX:DX = offset
  5332.     BP = timeout in timer ticks (1/18 sec)
  5333.     SI:DI = length
  5334. Return: AL = error code
  5335. --------------------------------------------------
  5336. INT 21 - Novell NetWare 4.6 - RELEASE PHYSICAL RECORD
  5337.     AH = BDh
  5338.     BX = file handle
  5339.     CX:DX = offset
  5340. Return: AL = error code
  5341. --------------------------------------------------
  5342. INT 21 - Novell NetWare 4.6 - CLEAR PHYSICAL RECORD
  5343.     AH = BEh
  5344.     BX = file handle
  5345.     CX:DX = offset
  5346. Return: AL = error code
  5347. --------------------------------------------------
  5348. INT 21 - Novell NetWare 4.6 - LOG RECORD (FCB)
  5349.     AH = BFh
  5350.     AL = flags
  5351.         bit 0: lock as well as log record
  5352.             1: non-exclusive lock
  5353.     DS:DX -> FCB
  5354.     BX:CX = offset
  5355.     BP = timeout in timer ticks (1/18 sec)
  5356.     SI:DI = length
  5357. Return: AL = error code
  5358. --------------------------------------------------
  5359. INT 21 - Novell NetWare 4.6 - RELEASE RECORD (FCB)
  5360.     AH = C0h
  5361.     DS:DX -> FCB
  5362.     BX:CX = offset
  5363. Return: AL = error code
  5364. --------------------------------------------------
  5365. INT 21 - Novell NetWare 4.6 - CLEAR RECORD (FCB)
  5366.     AH = C1h
  5367.     DS:DX -> FCB
  5368.     BX:CX = offset
  5369. Return: AL = error code
  5370. --------------------------------------------------
  5371. INT 21 - Novell NetWare 4.6 - LOCK PHYSICAL RECORD SET
  5372.     AH = C2h
  5373.     AL = flags
  5374.         bit 1: non-exclusive lock
  5375.     BP = timeout in timer ticks (1/18 sec)
  5376. Return: AL = error code
  5377. --------------------------------------------------
  5378. INT 21 - Novell NetWare 4.6 - RELEASE PHYSICAL RECORD SET
  5379.     AH = C3h
  5380. Return: AL = error code
  5381. --------------------------------------------------
  5382. INT 21 - Novell NetWare 4.6 - CLEAR PHYSICAL RECORD SET
  5383.     AH = C4h
  5384. Return: AL = error code
  5385. --------------------------------------------------
  5386. INT 21 - Novell NetWare 4.6 - SEMAPHORES
  5387.     AH = C5h
  5388.     AL = subfunction
  5389.         00h open semaphore
  5390.         DS:DX -> semaphore name
  5391.         CL = initial value
  5392.         01h examine semaphore
  5393.         Return: CX = semaphore value (sign extended)
  5394.             DL = open count
  5395.         02h wait on semaphore
  5396.         BP = timeout in timer ticks (1/18 sec)
  5397.         03h signal semaphore
  5398.         04h close semaphore
  5399.     CX:DX = semaphore handle (except function 00h)
  5400. Return: AL = error code
  5401.     if function 00h
  5402.        CX:DX = semaphore handle
  5403.        BL = open count
  5404. --------------------------------------------------
  5405. INT 21 - Novell NetWare 4.6 - GET OR SET LOCK MODE
  5406.     AH = C6h
  5407.     AL = subfunction
  5408.         00h set old "compatibility" mode
  5409.         01h set new extended locks mode 
  5410.         02h get lock mode
  5411. Return: AL = current lock mode
  5412. --------------------------------------------------
  5413. INT 21 - Novell NetWare 4.0 - TTS
  5414.     AH = C7h
  5415.     AL = subfunction
  5416.         00h begin transaction (NetWare SFT level II)
  5417.         Return: AL = error code
  5418.         01h end transaction (NetWare SFT level II)
  5419.         Return: AL = error code
  5420.             CX:DX = transaction reference number
  5421.         02h TTS available (NetWare SFT level II)
  5422.         Return: AL = completion code
  5423.                 00h TTS not available
  5424.                 01h TTS available
  5425.                 FDh TTS available but disabled
  5426.         03h abort transaction (NetWare SFT level II)
  5427.         Return: AL = error code
  5428.         04h transaction status
  5429.         05h get application thresholds
  5430.         06h set application thresholds
  5431.         07h get workstation thresholds
  5432.         08h set workstation thresholds
  5433. Return: ???
  5434. --------------------------------------------------
  5435. INT 21 - Novell NetWare 4.0 - BEGIN LOGICAL FILE LOCKING
  5436.     AH = C8h
  5437.     if function C6h lock mode 00h:
  5438.         DL = mode
  5439.         00h no wait
  5440.         01h wait
  5441.     if function C6h lock mode 01h:
  5442.         BP = timeout in timer ticks (1/18 sec)
  5443. Return: AL = error code
  5444. --------------------------------------------------
  5445. INT 21 - Novell NetWare 4.0 - END LOGICAL FILE LOCKING
  5446.     AH = C9h
  5447. Return: AL = error code
  5448. --------------------------------------------------
  5449. INT 21 - Novell NetWare 4.0 - LOG PERSONAL FILE (FCB)
  5450.     AH = CAh
  5451.     DS:DX -> FCB
  5452.     if function C6h lock mode 01h:
  5453.         AL = log and lock flag
  5454.         00h log file only
  5455.         01h lock as well as log file
  5456.         BP = timeout in timer ticks (1/18 sec)
  5457. Return: AL = error code
  5458. --------------------------------------------------
  5459. INT 21 - Novell NetWare 4.0 - LOCK FILE SET
  5460.     AH = CBh
  5461.     if function C6h lock mode 00h:
  5462.         DL = mode
  5463.         00h no wait
  5464.         01h wait
  5465.     if function C6h lock mode 01h:
  5466.         BP = timeout in timer ticks (1/18 sec)
  5467. Return: AL = error code
  5468. --------------------------------------------------
  5469. INT 21 - Novell NetWare 4.0 - RELEASE FILE (FCB)
  5470.     AH = CCh
  5471.     DS:DX -> FCB
  5472. Return: none
  5473. --------------------------------------------------
  5474. INT 21 - Novell NetWare 4.0 - RELEASE FILE SET
  5475.     AH = CDh
  5476. Return: none
  5477. --------------------------------------------------
  5478. INT 21 - Novell NetWare 4.0 - CLEAR FILE (FCB)
  5479.     AH = CEh
  5480.     DS:DX -> FCB
  5481. Return: AL = error code
  5482. --------------------------------------------------
  5483. INT 21 - Novell NetWare 4.0 - CLEAR FILE SET
  5484.     AH = CFh
  5485. Return: AL = 00h
  5486. --------------------------------------------------
  5487. INT 21 - Novell NetWare 4.6 - LOG LOGICAL RECORD
  5488.     AH = D0h
  5489.     DS:DX -> record string
  5490.     if function C6h lock mode 01h:
  5491.         AL = flags
  5492.         bit 0: lock as well as log the record
  5493.         bit 1: non-exclusive lock
  5494.         BP = timeout in timer ticks (1/18 sec)
  5495. Return: AL = error code
  5496. --------------------------------------------------
  5497. INT 21 - Novell NetWare 4.6 - LOCK LOGICAL RECORD SET
  5498.     AH = D1h
  5499.     if function C6h lock mode 00h:
  5500.         DL = mode
  5501.         00h no wait
  5502.         01h wait
  5503.     if function C6h lock mode 01h:
  5504.        BP = timeout in timer ticks (1/18 sec)
  5505. Return: AL = error code
  5506. --------------------------------------------------
  5507. INT 21 - Novell NetWare 4.0 - RELEASE LOGICAL RECORD
  5508.     AH = D2h
  5509.     DS:DX -> record string
  5510. Return: AL = error code
  5511. --------------------------------------------------
  5512. INT 21 - Novell NetWare 4.0 - RELEASE LOGICAL RECORD SET
  5513.     AH = D3h
  5514. Return: AL = error code
  5515. --------------------------------------------------
  5516. INT 21 - Novell NetWare 4.0 - CLEAR LOGICAL RECORD
  5517.     AH = D4h
  5518.     DS:DX -> record string
  5519. Return: AL = error code
  5520. --------------------------------------------------
  5521. INT 21 - Novell NetWare 4.0 - CLEAR LOGICAL RECORD SET
  5522.     AH = D5h
  5523. Return: AL = error code
  5524. --------------------------------------------------
  5525. INT 21 - Novell NetWare 4.0 - END OF JOB
  5526.     AH = D6h
  5527. Return: AL = error code
  5528. --------------------------------------------------
  5529. INT 21 - Novell NetWare 4.0 - SYSTEM LOGOUT
  5530.     AH = D7h
  5531. Return: AL = error code
  5532. --------------------------------------------------
  5533. INT 21 - Novell NetWare 4.0 - GET VOLUME STATISTICS
  5534.     AH = DAh
  5535.     DL = volume number
  5536.     ES:DI -> reply buffer
  5537. Return: AL = 00h
  5538.         reply buffer
  5539.         WORD  sectors/block
  5540.         WORD  total blocks
  5541.         WORD  unused blocks
  5542.         WORD  total directory entries
  5543.         WORD  unused directory entries
  5544.          16 BYTEs volume name, null padded
  5545.         WORD  removable flag, 0 = not removable
  5546. --------------------------------------------------
  5547. INT 21 - Novell NetWare 4.0 - GET NUMBER OF LOCAL DRIVES
  5548.     AH = DBh
  5549. Return: AL = number of local disks
  5550. --------------------------------------------------
  5551. INT 21 - Novell NetWare 4.0 - GET STATION NUMBER
  5552.     AH = DCh
  5553. Return: AL = station number
  5554.         0 if NetWare not loaded or this machine is a non-dedicated server
  5555.     CX = station number in ASCII
  5556. --------------------------------------------------
  5557. INT 21 - Novell NetWare 4.0 - SET ERROR MODE
  5558.     AH = DDh
  5559.     DL = error mode
  5560.         00h display critical I/O errors
  5561.         01h extended errors for all I/O in AL
  5562.         02h extended errors for critical I/O in AL
  5563. Return: AL = previous error mode
  5564. --------------------------------------------------
  5565. INT 21 - Novell NetWare 4.0 - SET BROADCAST MODE
  5566.     AH = DEh
  5567.     AL = broadcast mode
  5568.         00h receive console and workstation broadcasts
  5569.         01h receive console broadcasts only
  5570.         02h receive no broadcasts
  5571.         03h store all broadcasts for retrieval
  5572.         04h get broadcast mode
  5573.         05h disable shell tiemr interrupt checks
  5574.         06h enable shell timer interrupt checks
  5575. Return: AL = old broadcast mode
  5576. --------------------------------------------------
  5577. INT 21 - Novell NetWare 4.0 - CAPTURE
  5578.     AH = DFh
  5579.     AL = subfunction
  5580.         00h start LPT capture
  5581.         01h end LPT capture
  5582.         02h cancel LPT capture
  5583.         03h flush LPT capture
  5584.         04h start specific capture
  5585.         05h end specific capture
  5586.         06h cancel specific capture
  5587.         07h flush specific capture
  5588. Return: AL = error code
  5589. --------------------------------------------------
  5590. INT 21 - Novell NetWare 4.0 - PRINT SPOOLING
  5591.     AH = E0h
  5592.     DS:SI -> request buffer
  5593.     ES:DI -> reply buffer
  5594.     subfunction in third byte of request buffer
  5595.         00h spool data to a capture file
  5596.         01h close and queue capture file
  5597.         02h set spool flags
  5598.         03h spool existing file
  5599.         04h get spool queue entry
  5600.         05h remove entry from spool queue
  5601.         06h get printer status
  5602.         09h create a disk capture file
  5603. Return: AL = error code
  5604. --------------------------------------------------
  5605. INT 21 - Novell NetWare 4.0 - BROADCAST MESSAGES
  5606.     AH = E1h
  5607.         DS:SI -> request buffer
  5608.     ES:DI -> reply buffer
  5609.     subfunction in third byte of request buffer
  5610.         00h send broadcast message
  5611.         01h get broadcase message
  5612.         02h disable station broadcasts
  5613.         03h enable station broadcasts
  5614.         04h send personal message
  5615.         05h get personal message
  5616.         06h open message pipe
  5617.         07h close message pipe
  5618.         08h check pipe status
  5619.         09h broadcast to console
  5620. Return: AL = error code
  5621. --------------------------------------------------
  5622. INT 21 - Novell NetWare 4.0 - DIRECTORY FUNCTIONS
  5623.     AH = E2h
  5624.     DS:SI -> request buffer
  5625.     ES:DI -> reply buffer
  5626.     subfunction in third byte of request buffer
  5627.         00h set directory handle
  5628.         01h get directory path
  5629.         02h scan directory information
  5630.         03h get effective directory rights
  5631.         04h modify maximum rights mask
  5632.         05h get volume number
  5633.         06h get volume name
  5634.         0Ah create directory
  5635.         0Bh delete directory
  5636.         0Ch scan directory for trustees
  5637.         0Dh add trustee to directory
  5638.         0Eh delete trustee from directory
  5639.         0Fh rename directory
  5640.         10h purge erased files
  5641.         11h restore erased file
  5642.         12h allocate permanent directory handle
  5643.         13h allocate temporary directory handle
  5644.         14h deallocate directory handle
  5645.         15h get volume info with handle
  5646.         16h allocate special temporary directory handle
  5647.         17h retrieve a short base handle (Advanced NetWare 2.0)
  5648.         18h restore a short base handle (Advanced NetWare 2.0)
  5649.         19h set directory information
  5650. Return: AL = error code
  5651. --------------------------------------------------
  5652. INT 21 - Novell NetWare 4.0 - CONNECTION CONTROL
  5653.     AH = E3h
  5654.     DS:SI -> requst buffer
  5655.     ES:DI -> reply buffer
  5656.     subfunction in third byte of request buffer
  5657.         00h login
  5658.         01h change password
  5659.         02h map user to station set
  5660.         03h map object to number
  5661.         04h map number to object
  5662.         05h get station's logged information
  5663.         06h get station's root mask (obsolete)
  5664.         07h map group name to number
  5665.         08h map number to group name
  5666.         09h get memberset M of group G
  5667.         0Ah enter login area
  5668.         0Bh 
  5669.         0Ch
  5670.         0Dh log network message
  5671.         0Eh get disk utilization (Advanced NetWare 1.0)
  5672.         0Fh scan file information (Advanced NetWare 1.0)
  5673.         10h set file information (Advanced NetWare 1.0)
  5674.         11h get file server information (Advanced NetWare 1.0)
  5675.         12h
  5676.         13h get internet address (Advanced NetWare 1.02)
  5677.         14h login to file server (Advanced NetWare 2.0)
  5678.         15h get object connection numbers (Advanced NetWare 2.0)
  5679.         16h get connection information (Advanced NetWare 1.0)
  5680.         32h create object (Advanced NetWare 1.0)
  5681.         33h delete object (Advanced NetWare 1.0)
  5682.         34h rename object (Advanced NetWare 1.0)
  5683.         35h get object ID (Advanced NetWare 1.0)
  5684.         36h get object name (Advanced NetWare 1.0)
  5685.         37h scan object (Advanced NetWare 1.0)
  5686.         38h change object security (Advanced NetWare 1.0)
  5687.         39h create propery (Advanced NetWare 1.0)
  5688.         3Ah delete property (Advanced NetWare 1.0)
  5689.         3Bh change property security (Advanced NetWare 1.0)
  5690.         3Ch scan property (Advanced NetWare 1.0)
  5691.         3Dh read property value (Advanced NetWare 1.0)
  5692.         3Eh write property value (Advanced NetWare 1.0)
  5693.         3Fh verify object password (Advanced NetWare 1.0)
  5694.         40h change object password (Advanced NetWare 1.0)
  5695.         41h add object to set (Advanced NetWare 1.0)
  5696.         42h delete object from set (Advanced NetWare 1.0)
  5697.         43h is object in set? (Advanced NetWare 1.0)
  5698.         44h close bindery (Advanced NetWare 1.0)
  5699.         45h open bindery (Advanced NetWare 1.0)
  5700.         46h get bindery access level (Advanced NetWare 1.0)
  5701.         47h scan object trustee paths (Advanced NetWare 1.0)
  5702.         C8h check console priviledges
  5703.         C9h get file server description strings
  5704.         CAh set file server date and time
  5705.         CBh disable file server login
  5706.         CCh enable file server login
  5707.         CDh get file server login status
  5708.         CEh purge all erased files
  5709.         CFh disable transaction tracking
  5710.         D0h enable transaction tracking
  5711.         D1h send console broadcast
  5712.         D2h clear connection number
  5713.         D3h down file server
  5714.         D4h get file system statistics
  5715.         D5h get transaction tracking statistics
  5716.         D6h read disk cache statistics
  5717.         D7h get drive mapping table
  5718.         D8h read physical disk statistics
  5719.         D9h get disk channel statistics
  5720.         DAh get connection's task information
  5721.         DBh get list of connection's open files
  5722.         DCh get list of connections using a file
  5723.         DDh get physical record locks by connection and file
  5724.         DEh get physical record locks by file
  5725.         DFh get logical records by connection
  5726.         E0h get logical record information
  5727.         E1h get connection's semaphores
  5728.         E2h get semaphore information
  5729.         E3h get LAN driver's configuration information
  5730.         E5h get connection's usage statistics
  5731.         E6h get object's remaining disk space
  5732.         E7h get server LAN I/O statistics
  5733.         E8h get server miscellaneous information
  5734.         E9h get volume information
  5735. Return: AL = error code
  5736. --------------------------------------------------
  5737. INT 21 - Novell NetWare 4.0 - SET FILE ATTRIBUTES (FCB)
  5738.     AH = E4h
  5739.     CL = file attributes
  5740.         bit 0: read only
  5741.         1: hidden
  5742.         2: system
  5743.         7: shareable
  5744.     DX:DX -> FCB
  5745. Return: AL = error code
  5746. --------------------------------------------------
  5747. INT 21 - DoubleDos - INSTALLATION CHECK
  5748.     AX = E400h
  5749. Return: AL <> 0 if DoubleDos is active
  5750. --------------------------------------------------
  5751. INT 21 - Novell NetWare 4.0 - UPDATE FILE SIZE (FCB)
  5752.     AH = E5h
  5753.     DS:DX -> FCB
  5754. Return: AL = error code
  5755. --------------------------------------------------
  5756. INT 21 - Novell NetWare 4.0 - COPY FILE TO FILE (FCB)
  5757.     AH = E6h
  5758.     CX:DX = number of bytes to copy
  5759.     DS:SI -> source FCB
  5760.     ES:DI -> destination FCB
  5761. Return: AL = error code
  5762. --------------------------------------------------
  5763. INT 21 - Novell NetWare 4.0 - GET FILE SERVER DATE AND TIME
  5764.     AH = E7h
  5765.         DS:DX -> reply buffer
  5766.         BYTE  year - 1900
  5767.         BYTE  month
  5768.         BYTE  day
  5769.         BYTE  hours
  5770.         BYTE  minutes
  5771.         BYTE  seconds
  5772.         BYTE  day of week (0 = Sunday)
  5773. Return: AL = error code
  5774. --------------------------------------------------
  5775. INT 21 - Novell NetWare 4.6 - SET FCB RE-OPEN MODE
  5776.     AH = E8h
  5777.     DL = mode
  5778.         00h no automatic re-open
  5779.         01h auto re-open
  5780. Return: AL = error code
  5781. --------------------------------------------------
  5782. INT 21 - Novell NetWare 4.6 - SHELL'S "GET BASE STATUS"
  5783.     AH = E9h
  5784.     AL = subfunction
  5785.         00h get directory handle
  5786.     DX = drive number to check (0 = A:)
  5787. Return: AL = network pathbase
  5788.     AH = base flags
  5789.         00h drive not currently mapped to a base
  5790.             01h drive is mapped to a permanent base
  5791.         02h drive is mapped to a temporary base
  5792.         03h drive exists locally
  5793. --------------------------------------------------
  5794. INT 21 - Novell NetWare 4.6 - RETURN SHELL VERSION
  5795.     AH = EAh
  5796.     AL = subfunction
  5797.             00h return code in AL
  5798.         Return: AL = hardware type
  5799.                 00h IBM PC
  5800.                 01h Victor 9000
  5801.         01h get workstation environment string
  5802.         ES:DI -> 40-byte buffer
  5803.         Return: buffer filled with three null-terminated entries:
  5804.             major operating system
  5805.             version
  5806.             hardware type
  5807. Return: AH = 0 if DOS
  5808. --------------------------------------------------
  5809. INT 21 - DoubleDos - TURN OFF TASK SWITCHING
  5810.     AH = EAh
  5811. Return: task switching turned off
  5812. --------------------------------------------------
  5813. INT 21 - Novell NetWare 4.6 - LOG FILE
  5814.     AH = EBh
  5815.     DS:DX -> ASCIZ filename
  5816.         if function C6h lock mode 01h:
  5817.         AL = flags
  5818.                 00h log file only
  5819.                 01h lock as well as log file
  5820.         BP = timeout in timer ticks (1/18 second)
  5821. Return: AL = error code
  5822. --------------------------------------------------
  5823. INT 21 - DoubleDos - TURN ON TASK SWITCHING
  5824.     AH = EBh
  5825. Return: task switching turned on
  5826. --------------------------------------------------
  5827. INT 21 - Novell NetWare 4.6 - RELEASE FILE
  5828.     AH = ECh
  5829.     DS:DX -> ASCIZ filename
  5830. Return: none
  5831. --------------------------------------------------
  5832. INT 21 - DoubleDos - GET VIRTUAL SCREEN ADDRESS
  5833.     AH = ECh
  5834. Return: ES = segment of virtual screen
  5835. Note: Screen address can change if task-switching is on!!
  5836. --------------------------------------------------
  5837. INT 21 - Novell NetWare - CLEAR FILE
  5838.     AH = EDh
  5839.     DS:DX -> ASCIZ filename
  5840. Return: AL = error code
  5841. --------------------------------------------------
  5842. INT 21 - Novell NetWare 4.6 - GET PHYSICAL STATION NUMBER
  5843.     AH = EEh
  5844. Return: CX:BX:AX = six-byte address
  5845. --------------------------------------------------
  5846. INT 21 - DoubleDos - GIVE AWAY TIME TO OTHER TASKS
  5847.     AH = EEh
  5848.     AL = number of 55ms time slices to give away
  5849. Return: returns after giving away time slices
  5850. --------------------------------------------------
  5851. INT 21 - Novell Advanced NetWare 1.0+ - GET DRIVE INFO
  5852.     AH = EFh
  5853.     AL = subfunction
  5854.         00h get drive handle table
  5855.         01h get drive flag table
  5856.         02h get drive connection ID table
  5857.         03h get connection ID table
  5858.         04h get file server name table
  5859. Return: ES:DI -> shell status table
  5860. --------------------------------------------------
  5861. INT 21 - Novell Advanced NetWare 1.0+ - CONNECTION ID
  5862.     AH = F0h
  5863.     AL = subfunction
  5864.         00h set preferred connection ID
  5865.         01h get preferred connection ID
  5866.         02h get default connection ID
  5867.         03h LPT capture active
  5868.         04h set primary connection ID
  5869.         05h get primary connection ID
  5870.     DL = preferred file server
  5871. Return: AL = selected file server
  5872. --------------------------------------------------
  5873. INT 21 - Novell Advanced NetWare 1.0+ - FILE SERVER CONNECTION
  5874.     AH = F1h
  5875.     AL = subfunction
  5876.         00h attach to file server
  5877.         DL = preferred file server
  5878.         01h detach from file server
  5879.         02h logout from file server
  5880. Return: AL = completion code
  5881. --------------------------------------------------
  5882. INT 21 - Novell NetWare - ???
  5883.     AH = F2h
  5884.     ???
  5885. Return: ???
  5886. --------------------------------------------------
  5887. INT 21 - Novell Advanced NetWare 2.0+ - FILE SERVER FILE COPY
  5888.     AH = F3h
  5889.         ES:DI -> request string
  5890.         WORD  source file handle
  5891.         WORD  destination file handle
  5892.             DWORD starting offset in source
  5893.         DWORD starting offset in destination
  5894.         DWORD number of bytes to copy
  5895. Return: AL = status/error code
  5896.     CX:DX = number of bytes copied
  5897. --------------------------------------------------
  5898. INT 21 - CED - INSTALLABLE COMMANDS
  5899.     AH = FFh
  5900.        AL = 0 add installable command
  5901.          BL = mode - bit 0 = 1 callable from DOS prompt
  5902.              bit 1 = 1 callable from application
  5903.          DS:SI -> CR-terminated command name
  5904.          ES:DI -> FAR routine entry point
  5905.        AL = 1 remove installable command
  5906.          DS:SI -> CR-terminated command name
  5907.        AL = 2 reserved, may be used to test for CED installation
  5908. Return: CF set on error
  5909.         AX = 01h invalid function
  5910.          02h command not found (subfunction 1 only)
  5911.          08h insufficient memory (subfunction 0 only)
  5912.          0Eh bad data (subfunction 0 only)
  5913.     AH = 0FFh if CED not installed
  5914. --------------------------------------------------
  5915. INT 22 - DOS - TERMINATE ADDRESS
  5916.    FAR (DWORD) address of routine to be executed when program "returns to DOS".
  5917.    Should NEVER be called directly.
  5918. --------------------------------------------------
  5919. INT 23 - DOS - CONTROL "C" EXIT ADDRESS
  5920.    Automatically called from keyboard scanner when CTRL-C or CTRL-BREAK is
  5921.    detected. Normally aborts program and returns to DOS, but may be changed.
  5922. --------------------------------------------------
  5923. INT 24 - DOS - FATAL ERROR HANDLER ADDRESS
  5924.    Automatically called upon detection of unrecoverable I/O error.
  5925.    Normally points to routine in resident part of COMMAND.COM that prints
  5926.    "Abort, Retry, Ignore?" message and takes the reply, but may be overridden
  5927.    if desired.
  5928.  
  5929. Provides the following values in registers on entry to interrupt handler:
  5930.     AH: bit 7 = 0 disk I/O error
  5931.           = 1 other error -- if block device, bad FAT
  5932.                   -- if char device, code in DI
  5933.         bit 6  unused
  5934.         bit 5 = 1 if Ignore allowed, 0 if not (DOS 3.x)
  5935.         bit 4 = 1 if Retry allowed, 0 if not (DOS 3.x)
  5936.         bit 3 = 1 if Fail allowed, 0 if not (DOS 3.x)
  5937.         bit 2 \ disk area of error    00 = DOS area  01 = FAT
  5938.         bit 1 /            10 = root dir  11 = data area
  5939.         bit 0 = 1 if write, 0 if read
  5940.     AL = drive number if AH bit 7 = 1, otherwise undefined
  5941.     BP:SI = address of device header for which error occurred
  5942.         block device if high bit of BP:[SI+4] set
  5943.     low byte of DI:
  5944.        00h write-protect error
  5945.        01h unknown unit
  5946.        02h drive not ready
  5947.        03h unknown command
  5948.        04h data error (bad CRC)
  5949.        05h bad request structure length
  5950.        06h seek error
  5951.        07h unknown media type
  5952.        08h sector not found
  5953.        09h printer out of paper
  5954.        0Ah write fault
  5955.        0Bh read fault
  5956.        0Ch general failure
  5957.        0Dh (DOS 3.x) sharing violation
  5958.        0Eh (DOS 3.x) lock violation
  5959.        0Fh (DOS 3.x) invalid disk change
  5960.        10h (DOS 3.x) FCB unavailable
  5961.        11h (DOS 3.x) sharing buffer overflow
  5962. Handler must return
  5963.     AL = 00 ignore error
  5964.        = 01 retry operation
  5965.        = 02 terminate program through INT 22h
  5966.        = 03 fail system call in progress (DOS 3.x)
  5967. --------------------------------------------------
  5968. INT 25 - DOS - ABSOLUTE DISK READ (except DOS 4.0/COMPAQ DOS 3.31 >32M partitn)
  5969.     AL = Drive number (0=A, 1=B, etc)
  5970.     DS:BX = Disk Transfer Address (buffer)
  5971.     CX = Number of sectors to read
  5972.     DX = First relative sector to read
  5973. Return: CF set on error
  5974.         AL = error code issued to INT 24h in low half of DI
  5975.         AH = 80h if attachment failed to respond
  5976.          40h if seek operation failed
  5977.          20h if controller failed
  5978.          10h if data error (bad CRC)
  5979.          08h if DMA failure
  5980.          04h if requested sector not found
  5981.          03h if write-protected disk
  5982.          02h if bad address mark
  5983.          01h if bad command
  5984. Note: ORIGINAL FLAGS ON STACK!    May destroy all registers except segment regs
  5985. --------------------------------------------------
  5986. INT 25 - DOS 4.0/COMPAQ DOS 3.31 - ABSOLUTE DISK READ (>32M hard-disk partitn)
  5987.     AL = Drive number (0=A, 1=B, etc)
  5988.     CX = FFFFh
  5989.     DS:BX = Packet address
  5990.           DWORD sector number
  5991.           WORD    number of sectors to read
  5992.           DWORD transfer address
  5993. Return: same as above???
  5994. Note: partition is potentially >32M (and requires this form of the call) if
  5995.       bit 1 of device attribute word in device driver is set
  5996. --------------------------------------------------
  5997. INT 26 - DOS - ABSOLUTE DISK WRITE (except DOS 4.0/COMPAQ DOS 3.31 >32M partn)
  5998.     AL = Drive number (0=A, 1=B, etc)
  5999.     DS:BX = Disk Transfer Address (buffer)
  6000.     CX = Number of sectors to write
  6001.     DX = First relative sector to write
  6002. Return: CF set on error
  6003.         AL = error code issued to INT 24h in low half of DI
  6004.         AH = same error codes as for INT 25h
  6005. Note: ORIGINAL FLAGS ON STACK!
  6006. --------------------------------------------------
  6007. INT 26 - DOS 4.0/COMPAQ DOS 3.31 - ABSOLUTE DISK WRITE (>32M hard-disk partitn)
  6008.     AL = Drive number (0=A, 1=B, etc)
  6009.     CX = FFFFh
  6010.     DS:BX = Packet address
  6011.           DWORD sector number
  6012.           WORD    number of sectors to write
  6013.           DWORD transfer address
  6014. Return: same as above???
  6015. Note: partition is potentially >32M (and requires this form of the call) if
  6016.       bit 1 of device attribute word in device driver is set
  6017. --------------------------------------------------
  6018. INT 27 - DOS - TERMINATE BUT STAY RESIDENT
  6019.     CS = current program segment
  6020.     DX = last program byte + 1
  6021. Return: never
  6022. --------------------------------------------------
  6023. INT 28 - DOS Internal - KEYBOARD BUSY LOOP
  6024.    This interrupt is called from inside the "get input from keyboard" routine
  6025.    in DOS, if and only if it is safe to use INT 21 to access the disk at that
  6026.    time.  It is used primarily by the PRINT.COM routines and TSR programs, but
  6027.    any number of other routines could be chained to it by saving the original
  6028.    vector, and calling it with a FAR call (or just JMPing to it) at the end of
  6029.    the new routine.
  6030.  
  6031.    The INT 28h handler may invoke any INT 21h function except functions 00h
  6032.    through 0Ch (and 50h/51h under DOS 2.xx unless DOS CritErr flag is set).
  6033.  
  6034.    Until some program installs its own routine, this interrupt vector simply
  6035.    points to an IRET opcode.
  6036. --------------------------------------------------
  6037. INT 29 - DOS Internal - FAST PUTCHAR
  6038.    This interrupt is called from the DOS output routines if output is going to
  6039.    a device rather than a file, and the device driver's attribute word has
  6040.    bit 3 (04h) set to "1".
  6041. --------------------------------------------------
  6042. INT 2A - Microsoft Networks - NETWORK INSTALLATION CHECK
  6043.     AH = 00h
  6044. Return: AH <> 0 if installed
  6045. --------------------------------------------------
  6046. INT 2A - Microsoft Networks - CHECK DIRECT I/O
  6047.     AX = 0300h
  6048.     DS:SI -> ASCIZ disk device name
  6049. Return: CF clear if allowed
  6050. --------------------------------------------------
  6051. INT 2A - Microsoft Networks - EXECUTE NETBIOS
  6052.     AH = 04h
  6053.     AL = 0 for error retry, 1 for no retry
  6054.     ES:BX -> NCB
  6055. Return: AX = 0 for no error
  6056.     AH = 1, AL = error code
  6057. --------------------------------------------------
  6058. INT 2A - Microsoft Networks - GET NETWORK RESOURCE INFORMATION
  6059.     AX = 0500h
  6060. Return: AX = reserved
  6061.     BX = number of network names
  6062.     CX = number of commands
  6063.     DX = number of sessions
  6064. --------------------------------------------------
  6065. INT 2A - NETBIOS 1.10 - NETWORK PRINT-STREAM CONTROL
  6066.     AH = 06h
  6067.     ???
  6068. Return: ???
  6069. --------------------------------------------------
  6070. INT 2A - ???
  6071.     AX = 2001h
  6072.     ???
  6073. Return: ???
  6074. Note: intercepted by DESQview 2.0
  6075. --------------------------------------------------
  6076. INT 2A - Microsoft Networks - BEGIN DOS CRITICAL SECTION
  6077.     AH = 80h
  6078.     AL = 1 to 6
  6079. --------------------------------------------------
  6080. INT 2A - Microsoft Networks - END DOS CRITICAL SECTION
  6081.     AH = 81h
  6082.     AL = 1 to 6
  6083. --------------------------------------------------
  6084. INT 2A - Microsoft Networks - SERVER HOOK
  6085.     AH = 82h
  6086.     ???
  6087. Return: ???
  6088. Note: Called by the INT 21h function dispatcher for function 0 and functions
  6089.       greater than 0Ch except 59h
  6090. --------------------------------------------------
  6091. INT 2A - Microsoft Networks - KEYBOARD BUSY LOOP
  6092.     AH = 84h
  6093. Note: similar to DOS's INT 28h
  6094. --------------------------------------------------
  6095. INT 2B - Internal routine for MSDOS (IRET)
  6096. --------------------------------------------------
  6097. INT 2C - Internal routine for MSDOS (IRET)
  6098. --------------------------------------------------
  6099. INT 2D - Internal routine for MSDOS (IRET)
  6100. --------------------------------------------------
  6101. INT 2E - DOS 2+ Internal - EXECUTE COMMAND
  6102.     DS:SI -> counted CR-terminated command string
  6103.  
  6104. The top-level command.com executes the command; all registers are destroyed
  6105. as in EXEC (INT 21/AH=4Bh).
  6106. --------------------------------------------------
  6107. INT 2F - notes
  6108.     AH identifies which program is to handle the interrupt
  6109.        00h-7Fh reserved for DOS
  6110.        C0h-FFh reserved for applications
  6111.     AL is the function code
  6112. This is a general mechanism for verifying the presence of a TSR and 
  6113. communicating with it.
  6114. --------------------------------------------------
  6115. INT 2F - BMB Compuscience Canada Utilities Interface
  6116.     AH = xx (dynamically assigned based upon a search for a multiplex
  6117.          number which doesn't answer installed)
  6118.     AL = 00h install check
  6119.     ES:DI = EBEB:BEBE
  6120. Return: AL = 00h - not installed
  6121.          01h - not installed, no ok to install
  6122.          FFh - installed and is ES:DI=EBEB:BEBE then ES:DI will point
  6123.            to a string 'BMB xxxx' where xxxx is a product name and
  6124.            version
  6125. --------------------------------------------------
  6126. INT 2F - Multiplexor - PRINT - INSTALLATION CHECK
  6127.     AX = 0100h
  6128. Return: AL =
  6129.         00h not installed, OK to install
  6130.         01h not installed, not OK to install
  6131.         FFh installed
  6132. --------------------------------------------------
  6133. INT 2F - Multiplexor - PRINT - SUBMIT FILE
  6134.     AX = 0101h
  6135.     DS:DX -> packet
  6136.            BYTE level (must be 0)
  6137.            DWORD pointer to ASCIZ filename (no wildcards)
  6138. Return: CF set on error
  6139.         AX = error code
  6140. --------------------------------------------------
  6141. INT 2F - Multiplexor - PRINT - REMOVE FILE
  6142.     AX = 0102h
  6143.     DS:DX -> ASCIZ file name (wildcards allowed)
  6144. Return: CF set on error
  6145.         AX = error code
  6146. --------------------------------------------------
  6147. INT 2F - Multiplexor - PRINT - REMOVE ALL FILES
  6148.     AX = 0103h
  6149. Return: CF set on error
  6150.         AX = error code
  6151. --------------------------------------------------
  6152. INT 2F - Multiplexor - PRINT - HOLD QUEUE/GET STATUS
  6153.     AX = 0104h
  6154. Return: CF set on error
  6155.         AX = error code
  6156.         01h function invalid
  6157.         02h file not found
  6158.         03h path not found
  6159.         04h too many open files
  6160.         05h access denied
  6161.         08h queue full
  6162.         09h spooler busy
  6163.         0Ch name too long
  6164.         0Fh drive invalid
  6165.     DX = error count
  6166.     DS:SI -> print queue (null-string terminated
  6167.          list of 64-byte ASCIZ file names)
  6168. --------------------------------------------------
  6169. INT 2F - Multiplexor - PRINT - RESTART QUEUE
  6170.     AX = 0105h
  6171. Return: CF set on error
  6172.        AX = error code
  6173. --------------------------------------------------
  6174. INT 2F - Multiplexor - DOS 3.x CRITICAL ERROR HANDLER - INSTALLATION CHECK
  6175.     AX = 0500h
  6176. Return: AL = 00h not installed, OK to install
  6177.          01h not installed, can't install
  6178.          FFh installed
  6179. Note: this set of functions allows a user program to partially or completely
  6180.       override the default critical error handler in COMMAND.COM
  6181. --------------------------------------------------
  6182. INT 2F - Multiplexor - DOS 3.x CRITICAL ERROR HANDLER - HANDLE ERROR
  6183.     AH = 05h
  6184.     AL = extended error code (not zero)
  6185. Return: CF clear
  6186.         ES:DI -> ASCIZ error message
  6187.         AL = ???
  6188.     CF set: use default error handler
  6189. --------------------------------------------------
  6190. INT 2F - Multiplexor - ASSIGN - INSTALLATION CHECK
  6191.     AX = 0600h
  6192. Return: AH <> 0 if installed
  6193. --------------------------------------------------
  6194. INT 2F - Multiplexor - ASSIGN - GET MEMORY SEGMENT
  6195.     AX = 0601h
  6196. Return: ES = segment of ASSIGN work area
  6197. --------------------------------------------------
  6198. INT 2F - Multiplexor - DRIVER.SYS
  6199.     AH = 08h
  6200.     ???
  6201. --------------------------------------------------
  6202. INT 2F - Multiplexor - SHARE - INSTALLATION CHECK
  6203.     AX = 1000h
  6204. Return: AL = 00h  not installed, OK to install
  6205.          01h  not installed, not OK to install
  6206.          FFh  installed
  6207. --------------------------------------------------
  6208. INT 2F - Multiplexor - NETWORK REDIRECTOR - INSTALLATION CHECK
  6209.     AX = 1100h
  6210. Return: AL = 00h  not installed, OK to install
  6211.          01h  not installed, not OK to install
  6212.          FFh  installed
  6213. --------------------------------------------------
  6214. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6215.     AX = 1101h
  6216.     ???
  6217. Return: ???
  6218. --------------------------------------------------
  6219. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6220.     AX = 1103h
  6221.     ???
  6222. Return: ???
  6223. --------------------------------------------------
  6224. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6225.     AX = 1105h
  6226.     ???
  6227. Return: ???
  6228. --------------------------------------------------
  6229. INT 2F - Multiplexor - NETWORK REDIRECTOR - CLOSE REMOTE FILE
  6230.     AX = 1106h
  6231.     ???
  6232. Return: ???
  6233. --------------------------------------------------
  6234. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6235.     AX = 1107h
  6236.     ???
  6237. Return: ???
  6238. --------------------------------------------------
  6239. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6240.     AX = 1108h
  6241.     ???
  6242. Return: ???
  6243. --------------------------------------------------
  6244. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6245.     AX = 1109h
  6246.     ???
  6247. Return: ???
  6248. --------------------------------------------------
  6249. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6250.     AX = 110Ah
  6251.     STACK: WORD ???
  6252. Return: CF set on error
  6253. --------------------------------------------------
  6254. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6255.     AX = 110Bh
  6256.     STACK: WORD ???
  6257. Return: CF set on error???
  6258. --------------------------------------------------
  6259. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6260.     AX = 110Ch
  6261.     ???
  6262. Return: ???
  6263. --------------------------------------------------
  6264. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6265.     AX = 110Eh
  6266.     STACK: WORD ???
  6267. Return: ???
  6268. --------------------------------------------------
  6269. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6270.     AX = 110Fh
  6271.     ???
  6272. Return: ???
  6273. --------------------------------------------------
  6274. INT 2F - Multiplexor - NETWORK REDIRECTOR - RENAME FILE???
  6275.     AX = 1111h
  6276.     ???
  6277. Return: ???
  6278. --------------------------------------------------
  6279. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6280.     AX = 1113h
  6281. Return: ???
  6282. --------------------------------------------------
  6283. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6284.     AX = 1116h
  6285.     ???
  6286. Return: ???
  6287. --------------------------------------------------
  6288. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6289.     AX = 1117h
  6290.     STACK: WORD ???
  6291. Return: ???
  6292. --------------------------------------------------
  6293. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6294.     AX = 1118h
  6295.     STACK: WORD ???
  6296. Return: ???
  6297. --------------------------------------------------
  6298. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6299.     AX = 1119h
  6300.     ???
  6301. Return: ???
  6302. --------------------------------------------------
  6303. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6304.     AX = 111Bh
  6305.     ???
  6306. Return: ???
  6307. --------------------------------------------------
  6308. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6309.     AX = 111Ch
  6310.     ???
  6311. Return: ???
  6312. --------------------------------------------------
  6313. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6314.     AX = 111Dh
  6315.     DS???
  6316. Return: ???
  6317. --------------------------------------------------
  6318. INT 2F - Multiplexor - NETWORK REDIRECTOR - DO REDIRECTION
  6319.     AX = 111Eh
  6320.     STACK: WORD function to execute
  6321. Return: CF set on error
  6322. --------------------------------------------------
  6323. INT 2F - Multiplexor - NETWORK REDIRECTOR - PRINTER SETUP
  6324.     AX = 111Fh
  6325.     STACK: WORD function???
  6326. Return: CF set on error???
  6327. --------------------------------------------------
  6328. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6329.     AX = 1120h
  6330.     ???
  6331. Return: ???
  6332. --------------------------------------------------
  6333. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6334.     AX = 1121h
  6335.     ???
  6336. Return: CF set on error???
  6337. --------------------------------------------------
  6338. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6339.     AX = 1122h
  6340.     ???
  6341. Return: ???
  6342. --------------------------------------------------
  6343. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6344.     AX = 1123h
  6345.     ???
  6346. Return: CF set on error???
  6347. --------------------------------------------------
  6348. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6349.     AX = 1124h
  6350.     ???
  6351. Return: ???
  6352. --------------------------------------------------
  6353. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6354.     AX = 1125h
  6355.     STACK: WORD ???
  6356. Return: ???
  6357.     CF set on error???
  6358. --------------------------------------------------
  6359. INT 2F - Multiplexor - NETWORK REDIRECTOR - ???
  6360.     AX = 1126h
  6361.     ???
  6362. Return: CF set on error???
  6363. --------------------------------------------------
  6364. INT 2F - Multiplexor - DOS 3.x internal services - INSTALLATION CHECK
  6365.     AX = 1200h
  6366. Return: AL = FFh (for compatibility with other INT 2F functions)
  6367. --------------------------------------------------
  6368. INT 2F - Multiplexor - DOS 3.x internal services - CLOSE FILE???
  6369.     AX = 1201h
  6370.     STACK: WORD ???
  6371. Return: BX???
  6372.     CX???
  6373.     ES:DI -> ???
  6374. Note: can be called only from within DOS
  6375. --------------------------------------------------
  6376. INT 2F - Multiplexor - DOS 3.x internal services - GET INTERRUPT ADDRESS
  6377.     AX = 1202h
  6378.     STACK: WORD vector number
  6379. Return: ES:BX -> interrupt vector
  6380.     Stack unchanged
  6381. --------------------------------------------------
  6382. INT 2F - Multiplexor - DOS 3.x internal services - GET DOS DATA SEGMENT
  6383.     AX = 1203h
  6384. Return: DS = segment of IBMDOS
  6385. --------------------------------------------------
  6386. INT 2F - Multiplexor - DOS 3.x internal services - NORMALIZE PATH SEPARATOR
  6387.     AX = 1204h
  6388.     STACK: WORD character to normalize
  6389. Return: AL = normalized character (forward slash turned to backslash)
  6390.     Stack unchanged
  6391. --------------------------------------------------
  6392. INT 2F - Multiplexor - DOS 3.x internal services - OUTPUT CHARACTER
  6393.     AX = 1205h
  6394.     STACK: WORD character to output
  6395. Return: Stack unchanged
  6396. Note: can be called only from within DOS
  6397. --------------------------------------------------
  6398. INT 2F - Multiplexor - DOS 3.x internal services - INVOKE CRITICAL ERROR
  6399.     AX = 1206h
  6400. Return: AL = 0-3 for Abort, Retry, Ignore, Fail
  6401. Note: can be called only from within DOS
  6402. --------------------------------------------------
  6403. INT 2F - Multiplexor - DOS 3.x internal services - MOVE DISK BUFFER???
  6404.     AX = 1207h
  6405.     DS:DI -> disk buffer
  6406. Return: buffer moved to end of buffer list
  6407. Note: can be called only from within DOS
  6408. --------------------------------------------------
  6409. INT 2F - Multiplexor - DOS 3.x internal services - DECREMENT WORD
  6410.     AX = 1208h
  6411.     ES:DI -> word to decrement
  6412. Return: AX = new value of word
  6413.     word pointed to by ES:DI decremented, skipping zero
  6414. --------------------------------------------------
  6415. INT 2F - Multiplexor - DOS 3.x internal services - ???
  6416.     AX = 1209h
  6417.     DS:DI -> disk buffer???
  6418. Return: ???
  6419. Note: can be called only from within DOS
  6420. --------------------------------------------------
  6421. INT 2F - Multiplexor - DOS 3.x internal services - ???
  6422.     AX = 120Ah
  6423.     ???
  6424. Return: ???
  6425. Note: can be called only from within DOS
  6426. --------------------------------------------------
  6427. INT 2F - Multiplexor - DOS 3.x internal services - ???
  6428.     AX = 120Bh
  6429.     ES:DI -> system file table entry???
  6430.     ???
  6431. Return: AX = ???
  6432. Note: can be called only from within DOS
  6433. --------------------------------------------------
  6434. INT 2F - Multiplexor - DOS 3.x internal services - ???
  6435.     AX = 120Ch
  6436.     ???
  6437. Return: ???
  6438. Note: can be called only from within DOS
  6439. --------------------------------------------------
  6440. INT 2F - Multiplexor - DOS 3.x internal services - GET DATE AND TIME
  6441.     AX = 120Dh
  6442. Return: AX = current date in packed format
  6443.     DX = current time in packed format
  6444. Note: can be called only from within DOS
  6445. --------------------------------------------------
  6446. INT 2F - Multiplexor - DOS 3.x internal services - ??? ALL DISK BUFFERS
  6447.     AX = 120Eh
  6448. Return: DS:DI -> first disk buffer
  6449. Note: can be called only from within DOS
  6450. --------------------------------------------------
  6451. INT 2F - Multiplexor - DOS 3.x internal services - ???
  6452.     AX = 120Fh
  6453.     DS:DI -> ???
  6454. Return: DS:DI -> ???
  6455. Note: can be called only from within DOS
  6456.       calls on function 1207h
  6457. --------------------------------------------------
  6458. INT 2F - Multiplexor - DOS 3.x internal services - FIND DIRTY BUFFER
  6459.     AX = 1210h
  6460.     DS:DI -> first disk buffer
  6461. Return: DS:DI -> first disk buffer which has clean flag clear
  6462.     ZF clear if found, set if not found
  6463. --------------------------------------------------
  6464. INT 2F - Multiplexor - DOS 3.x internal services - NORMALIZE ASCIZ FILENAME
  6465.     AX = 1211h
  6466.     DS:SI -> ASCIZ filename to normalize
  6467.     ES:DI -> buffer for normalized filename
  6468. Return: destination buffer filled with uppercase filename, with slashes turned
  6469.     to backslashes
  6470. --------------------------------------------------
  6471. INT 2F - Multiplexor - DOS 3.x internal services - GET LENGTH OF ASCIZ STRING
  6472.     AX = 1212h
  6473.     ES:DI -> ASCIZ string
  6474. Return: CX = length of string
  6475. --------------------------------------------------
  6476. INT 2F - Multiplexor - DOS 3.x internal services - UPPERCASE CHARACTER
  6477.     AX = 1213h
  6478.     STACK: WORD character to convert to uppercase
  6479. Return: AL = uppercase character
  6480.     Stack unchanged
  6481. --------------------------------------------------
  6482. INT 2F - Multiplexor - DOS 3.x internal services - COMPARE FAR POINTERS
  6483.     AX = 1214h
  6484.     DS:SI = first pointer
  6485.     ES:DI = second pointer
  6486. Return: ZF set if pointers are equal, ZF clear if not equal
  6487. --------------------------------------------------
  6488. INT 2F - Multiplexor - DOS 3.x internal services - ???
  6489.     AX = 1215h
  6490.     DS:DI -> disk buffer
  6491.     STACK: WORD ???
  6492. Return: Stack unchanged
  6493. Note: can be called only from within DOS
  6494. --------------------------------------------------
  6495. INT 2F - Multiplexor - DOS 3.x internal services - GET ADDRESS OF SYSTEM FCB
  6496.     AX = 1216h
  6497.     BX = system file table entry number
  6498. Return: ES:DI -> system file table entry
  6499. --------------------------------------------------
  6500. INT 2F - Multiplexor - DOS 3.x internal services - SET DEFAULT DRIVE ???
  6501.     AX = 1217h
  6502.     STACK: WORD drive (0 = A:, 1 = B:, etc)
  6503. Return: DS:SI -> drive data block for specified drive
  6504.     Stack unchanged
  6505. Note: can be called only from within DOS
  6506. --------------------------------------------------
  6507. INT 2F - Multiplexor - DOS 3.x internal services - GET ???
  6508.     AX = 1218h
  6509. Return: DS:SI -> ???
  6510. --------------------------------------------------
  6511. INT 2F - Multiplexor - DOS 3.x internal services - ???
  6512.     AX = 1219h
  6513.     STACK: WORD drive (0 = default, 1 = A:, etc)
  6514. Return: ???
  6515.     Stack unchanged
  6516. Note: can be called only from within DOS
  6517.     calls function 1217h
  6518. --------------------------------------------------
  6519. INT 2F - Multiplexor - DOS 3.x internal services - GET FILE'S DRIVE
  6520.     AX = 121Ah
  6521.     DS:SI -> filename
  6522. Return: AL = drive (0 = default, 1 = A:, etc, FFh = invalid)
  6523. --------------------------------------------------
  6524. INT 2F - Multiplexor - DOS 3.x internal services - SET ???
  6525.     AX = 121Bh
  6526.     CL = ???
  6527. Return: AL = ???
  6528. Note: can be called only from within DOS
  6529. --------------------------------------------------
  6530. INT 2F - Multiplexor - DOS 3.x internal services - CHECKSUM MEMORY
  6531.     AX = 121Ch
  6532.     DS:SI -> start of memory to checksum
  6533.     CX = number of bytes
  6534.     DX = initial checksum
  6535. Return: DX = checksum
  6536. Note: can be called only from within DOS
  6537. --------------------------------------------------
  6538. INT 2F - Multiplexor - DOS 3.x internal services - ???
  6539.     AX = 121Dh
  6540.     DS:SI -> ???
  6541.     CX = ???
  6542.     DX = ???
  6543. Return: AX = ???
  6544.     CX = ???
  6545.     DX = ???
  6546. --------------------------------------------------
  6547. INT 2F - Multiplexor - DOS 3.x internal services - COMPARE FILENAMES
  6548.     AX = 121Eh
  6549.     DS:SI -> first ASCIZ filename
  6550.     ES:DI -> second ASCIZ filename
  6551. Return: ZF set if filenames equivalent, ZF clear if not
  6552. --------------------------------------------------
  6553. INT 2F - Multiplexor - DOS 3.x internal services - BUILD DRIVE INFO BLOCK
  6554.     AX = 121Fh
  6555.     STACK: WORD drive letter
  6556. Return: ES:DI -> drive info block (will be overwritten by next call)
  6557.     Stack unchanged
  6558. Note: can be called only from within DOS
  6559. --------------------------------------------------
  6560. INT 2F - Multiplexor - DOS 3.x internal services - GET SYSTEM FILE TABLE NUMBER
  6561.     AX = 1220h
  6562.     BX = file handle
  6563. Return: CF set on error
  6564.         AL = 6 (invalid file handle)
  6565.     CF clear if successful
  6566.         BYTE ES:[DI] = system file table entry number for file handle
  6567. --------------------------------------------------
  6568. INT 2F - Multiplexor - DOS 3.x internal services - ???
  6569.     AX = 1221h
  6570.     DS:SI -> ???
  6571. Return: ???
  6572. Note: can be called only from within DOS
  6573. --------------------------------------------------
  6574. INT 2F - Multiplexor - DOS 3.x internal services - ???
  6575.     AX = 1222h
  6576.     SS:SI -> ???
  6577. Return: nothing???
  6578. Note: can be called only from within DOS
  6579. --------------------------------------------------
  6580. INT 2F - Multiplexor - DOS 3.x internal services - CHECK IF CHARACTER DEVICE???
  6581.     AX = 1223h
  6582.     ???
  6583. Return: DS:SI -> device driver with same name as ???
  6584. Note: can be called only from within DOS
  6585. --------------------------------------------------
  6586. INT 2F - Multiplexor - DOS 3.x internal services - DELAY
  6587.     AX = 1224h
  6588. Return: after delay of ??? ms
  6589. Note: can be called only from within DOS
  6590. --------------------------------------------------
  6591. INT 2F - Multiplexor - DOS 3.x internal services - GET LENGTH OF ASCIZ STRING
  6592.     AX = 1225h
  6593.     DS:SI -> ASCIZ string
  6594. Return: CX = length of string
  6595. --------------------------------------------------
  6596. INT 2F - Multiplexor - NLSFUNC.COM
  6597.     AH = 14h
  6598.     ???
  6599. --------------------------------------------------
  6600. INT 2F - Multiplexor - CDROM - INSTALLATION CHECK
  6601.     AX = 1500h
  6602.     BX = 0
  6603. Return: BX = number of CDROM drive letters used
  6604.     CX = strating drive letter (0=A:)
  6605. Note: this installation check DOES NOT follow the format used by other software
  6606. --------------------------------------------------
  6607. INT 2F - Multiplexor - CDROM - GET DRIVE DEVICE LIST
  6608.     AX = 1501h
  6609.     ES:BX -> bufer to hold drive letter list (5 bytes per drive letter)
  6610. Return: buffer filled, for each drive letter
  6611.       BYTE    subunit number in driver
  6612.       DWORD address of device driver header
  6613. --------------------------------------------------
  6614. INT 2F - Multiplexor - CDROM - GET COPYRIGHT FILE NAME
  6615.     AX = 1502h
  6616.     ES:BX -> 38-byte buffer for name of copyright file
  6617.     CX = drive number (0=A:)
  6618. Return: CF set if drive is not a CDROM drive
  6619.         AX = 15 (invalid drive)
  6620. --------------------------------------------------
  6621. INT 2F - Multiplexor - CDROM - GET ABSTRACT FILE NAME
  6622.     AX = 1503h
  6623.     ES:BX -> 38-byte buffer for name of abstract file
  6624.     CX = drive number (0=A:)
  6625. Return: CF set if drive is not a CDROM drive
  6626.         AX = 15 (invalid drive)
  6627. --------------------------------------------------
  6628. INT 2F - Multiplexor - CDROM - GET BIBLIOGRAPHIC DOC FILE NAME
  6629.     AX = 1504h
  6630.     ES:BX -> 38-byte buffer for name of bibliographic documentation file
  6631.     CX = drive number (0=A:)
  6632. Return: CF set if drive is not a CDROM drive
  6633.         AX = 15 (invalid drive)
  6634. --------------------------------------------------
  6635. INT 2F - Multiplexor - CDROM - READ VTOC
  6636.     AX = 1505h
  6637.     ES:BX -> 2048-byte buffer
  6638.     CX = drive number (0=A:)
  6639.     DX = sector index (0=first volume descriptor,1=second,...)
  6640. Return: CF set on error
  6641.         AX = error code (15=invalid drive,21=not ready)
  6642.     CF clear if successful
  6643.         AX = volume descriptor type (1=standard,FFh=terminator,0=other)
  6644. --------------------------------------------------
  6645. INT 2F - Multiplexor - CDROM - TURN DEBUGGING ON
  6646.     AX = 1506h
  6647.     BX = debugging function to enable
  6648. Note: reserved for development
  6649. --------------------------------------------------
  6650. INT 2F - Multiplexor - CDROM - TURN DEBUGGING OFF
  6651.     AX = 1507h
  6652.     BX = debugging function to disable
  6653. Note: reserved for development
  6654. --------------------------------------------------
  6655. INT 2F - Multiplexor - CDROM - ABSOLUTE DISK READ
  6656.     AX = 1508h
  6657.     ES:BX -> buffer
  6658.     CX = drive number (0=A:)
  6659.     SI:DI = starting sector number
  6660.     DX = number of sectors to read
  6661. Return: CF set on error
  6662.         AL = error code (15=invalid drive,21=not ready)
  6663. --------------------------------------------------
  6664. INT 2F - Multiplexor - CDROM - ABSOLUTE DISK WRITE
  6665.     AX = 1509h
  6666.     ES:BX -> buffer
  6667.     CX = drive number (0=A:)
  6668.     SI:DI = starting sector number
  6669.     DX = number of sectors to write
  6670. Note: corresponds to INT 26h and is currently reserved and nonfunctional
  6671. --------------------------------------------------
  6672. INT 2F - Multiplexor - CDROM - RESERVED
  6673.     AX = 150Ah
  6674. --------------------------------------------------
  6675. INT 2F - Multiplexor - CDROM 2.00 - DRIVE CHECK
  6676.     AX = 150Bh
  6677.     CX = drive number (0=A:)
  6678. Return: BX = ADADh if MSCDEX.EXE installed
  6679.         AX = 0 if drive not supported
  6680.            <> 0 if supported
  6681. --------------------------------------------------
  6682. INT 2F - Multiplexor - CDROM 2.00 - GET MSCDEX.EXE VERSION
  6683.     AX = 150Ch
  6684. Return: BH = major version
  6685.     BL = minor version
  6686. Note: MSCDEX.EXE versions prior to 1.02 return BX=0
  6687. --------------------------------------------------
  6688. INT 2F - Multiplexor - CDROM 2.00 - GET CDROM DRIVE LETTERS
  6689.     AX = 150Dh
  6690.     ES:BX -> buffer for drive letter list (1 byte per drive)
  6691. Return: buffer filled with drive numbers (0=A:).  Each byte corresponds
  6692.     to the drive in the same position for function 1501h
  6693. --------------------------------------------------
  6694. INT 2F - Multiplexor - CDROM 2.00 - GET/SET VOLUME DESCRIPTOR PREFERENCE
  6695.     AX = 150Eh
  6696.     BX = subfunction
  6697.         00h get preference
  6698.         DX = 0
  6699.         Return: DX = preference settings
  6700.         01h set preference
  6701.         DH = volume descriptor preference
  6702.             1 = primary volume descriptor
  6703.             2 = supplementary volume descriptor
  6704.         DL = supplementary volume descriptor preference
  6705.             1 = shift-Kanji
  6706.     CX = drive number (0=A:)
  6707. Return: CF set on error
  6708.         AX = error code (15=invalid drive,1=invalid function)
  6709. --------------------------------------------------
  6710. INT 2F - Multiplexor - CDROM 2.00 - GET DIRECTORY ENTRY
  6711.     AX = 150Fh
  6712.     CX = drive number (0=A:)
  6713.     ES:BX -> ASCIZ path name
  6714.     SI:DI -> 255-byte buffer for directory entry
  6715. Return: CF set on error
  6716.         AX = error code
  6717.     CF clear if succesful
  6718.         AX = disk format (0=High Sierra,1=ISO 9660)
  6719.  
  6720. directory entry
  6721.     BYTE  length of directory entry
  6722.     BYTE  length of XAR in LBN's (don't ask me what that means...)
  6723.     DWORD LBN of data, Intel (little-endian) format
  6724.     DWORD LBN of data, Motorola (big-endian) format
  6725.     DWORD length of file, Intal format
  6726.     DWORD length of file, Motorola format
  6727. ---High Sierra---
  6728.       6 BYTEs date and time
  6729.     BYTE  bit flags
  6730.     BYTE  reserved
  6731. ---ISO 9660---
  6732.       7 BYTEs data and time
  6733.     BYTE  bit flags
  6734. ---both formats---
  6735.     BYTE  interleave size
  6736.     BYTE  interleave skip factor
  6737.     WORD  volume set sequence number, Intel format
  6738.     WORD  volume set sequence number, Motorola format
  6739.     BYTE  length of file name
  6740.       N BYTEs file name
  6741.     BYTE (optional) padding if filename is odd length
  6742.       N BYTEs system data
  6743. --------------------------------------------------
  6744. INT 2F - Multiplexor - XMS - INSTALLATION CHECK
  6745.     AX = 4300h
  6746. Return: AL = 80h XMS driver installed
  6747.     AL <> 80h no driver
  6748. Note: XMS gives access to extended memory and noncontiguous/nonEMS memory
  6749.       above 640K
  6750. --------------------------------------------------
  6751. INT 2F - Multiplexor - XMS - GET DRIVER ADDRESS
  6752.     AX = 4310h
  6753. Return: ES:BX -> driver entry point
  6754.  
  6755. Perform a FAR call to the driver entry point with AH set to the function code
  6756.     AH    function
  6757.     00h  Get XMS version number
  6758.          Return: AX = XMS version (in BCD)
  6759.              BX = internal revision number
  6760.              DX = 1 if HMA (1M to 1M + 64K) exists
  6761.               0 if HMA does not exist
  6762.     01h  Request High Memory Area (1M to 1M + 64K)
  6763.          DX = memory in bytes (for TSR or device drivers)
  6764.           FFFFh if application program
  6765.          Return: AX = 1 success
  6766.             = 0 failure
  6767.                BL = error code
  6768.     02h  Release High Memory Area
  6769.          Return: AX = 1 success
  6770.             = 0 failure
  6771.                BL = error code
  6772.     03h  Global enable A20, for using the HMA
  6773.          Return: AX = 1 success
  6774.             = 0 failure
  6775.                BL = error code
  6776.     04h  Global disable A20
  6777.          Return: AX = 1 success
  6778.             = 0 failure
  6779.                BL = error code
  6780.     05h  Local enable A20, for direct access to extended memory
  6781.          Return: AX = 1 success
  6782.             = 0 failure
  6783.                BL = error code
  6784.     06h  Local disable A20
  6785.          Return: AX = 1 success
  6786.             = 0 failure
  6787.                BL = error code
  6788.     07h  Query A20
  6789.          Return: AX = 1 enabled
  6790.             = 0 disabled
  6791.                      BL = error code (0 = successful)
  6792.     08h  Query free extended memory, not counting HMA
  6793.          Return: AX = size of largest extended memory block in K
  6794.              DX = total extended memory in K
  6795.              BL = error code
  6796.     09h  Allocate extended memory block
  6797.          DX = Kbytes needed
  6798.          Return: AX = 1 success
  6799.                DX = handle for memory block
  6800.             = 0 failure
  6801.                BL = error code
  6802.     0Ah  Free extended memory block
  6803.          DX = handle of block to free
  6804.          Return: AX = 1 success
  6805.             = 0 failure
  6806.                BL = error code
  6807.     0Bh  Move extended memory block
  6808.          DS:SI -> EMM structure
  6809.             DWORD number of bytes to move (must be even)
  6810.             WORD source handle
  6811.             DWORD offset into source block
  6812.             WORD destination handle
  6813.             DWORD offset into destination block
  6814.          Note: if either handle is 0000h, the corresponding offset is
  6815.            considered to be an absolute Segment:Offset address in
  6816.            directly addressable memory
  6817.          Return: AX = 1 success
  6818.             = 0 failure
  6819.                BL = error code
  6820.     0Ch  Lock extended memory block
  6821.          DX = handle of block to lock
  6822.          Return: AX = 1 success
  6823.                DX:BX = 32-bit linear address of locked block
  6824.             = 0 failure
  6825.                BL = error code
  6826.     0Dh  Unlock extended memory block
  6827.          DX = handle of block to unlock
  6828.          Return: AX = 1 success
  6829.             = 0 failure
  6830.                BL = error code
  6831.     0Eh  Get handle information
  6832.          DX = handle for which to get info
  6833.          Return: AX = 1 success
  6834.                BH = block's lock count
  6835.                BL = number of free handles left
  6836.                DX = block size in K
  6837.             = 0 failure
  6838.                BL = error code
  6839.     0Fh  Reallocate extended memory block
  6840.          DX = handle of block
  6841.          BX = new size of block in K
  6842.          Return: AX = 1 success
  6843.             = 0 failure
  6844.                BL = error code
  6845.     10h  Request upper memory block (nonEMS memory above 640K)
  6846.          DX = size of block in paragraphs
  6847.          Return: AX = 1 success
  6848.                BX = segment address of UMB
  6849.                DX = actual size of block
  6850.             = 0 failure
  6851.                BL = error code
  6852.                DX = largest available block
  6853.     11h  Release upper memory block
  6854.          DX = segment address of UMB to release
  6855.          Return: AX = 1 success
  6856.             = 0 failure
  6857.                BL = error code
  6858. Note: HIMEM.SYS requires at least 256 bytes stack
  6859.  
  6860. Error codes returned in BL:
  6861.     80h Function not implemented
  6862.     81h Vdisk was detected
  6863.     82h An A20 error occurred
  6864.     8Eh a general driver error
  6865.     8Fh unrecoverable driver error
  6866.     90h HMA does not exist
  6867.     91h HMA is already in use
  6868.     92h DX is less than the /HMAMIN= parameter
  6869.     93h HMA is not allocated
  6870.         94h A20 line still enabled
  6871.     A0h all extended memory is allocated
  6872.     A1h all available extended memory handles are allocated
  6873.     A2h Invalid handle
  6874.     A3h Source handle is invalid
  6875.     A4h Source offset is invalid
  6876.     A5h Destination handle is invalid
  6877.     A6h Destination offset is invalid
  6878.     A7h Length is invalid
  6879.     A8h Move has an invalid overlap
  6880.     A9h Parity error occurred
  6881.     AAh Block is not locked
  6882.     ABh Block is locked
  6883.     ACh Block lock count overflowed
  6884.     ADh Lock failed
  6885.     B0h Only a smaller UMB is available
  6886.     B1h No UMB's are available
  6887.     B2h UMB segment number is invalid
  6888. --------------------------------------------------
  6889. INT 2F - Multiplexor - SCRNSAV2.COM - INSTALLATION CHECK
  6890.     AX = 6400h
  6891. Return: AL = 00h not installed
  6892.          FFh installed
  6893. Note: SCRNSAV2.COM is a screen saver for PS/2's with VGA by Alan Ballard
  6894. --------------------------------------------------
  6895. INT 2F - Multiplexor - Novell NetWare - INSTALLATION CHECK
  6896.     AX = 7A00h
  6897. Return: AL = 00h not installed
  6898.        = FFh installed
  6899.         ES:DI -> FAR entry point for routines otherwise accessed
  6900.              through INT 21h
  6901. --------------------------------------------------
  6902. INT 2F - Multiplexor - VIDCLOCK.COM - INSTALLATION CHECK
  6903.     AX = AA00h
  6904. Return: AL = 00h not installed
  6905.          FFh installed
  6906. Note: VIDCLOCK.COM is a memory-resident clock by Thomas G. Hanlin III
  6907. --------------------------------------------------
  6908. INT 2F - Multiplexor - GRAFTABL.COM or DISPLAY.SYS
  6909.     AH = B0h
  6910.     ???
  6911. --------------------------------------------------
  6912. INT 2F - Multiplexor - APPEND - INSTALLATION CHECK
  6913.     AX = B700h
  6914. Return: AH <> 0 if installed
  6915. --------------------------------------------------
  6916. INT 2F - Multiplexor - APPEND - ???
  6917.     AX = B701h
  6918.     ???
  6919. --------------------------------------------------
  6920. INT 2F - Multiplexor - APPEND - VERSION CHECK
  6921.     AX = B702h
  6922.     ???
  6923. Return: ???
  6924. --------------------------------------------------
  6925. INT 2F - Multiplexor - Network - INSTALLATION CHECK
  6926.     AX = B800h
  6927. Return: AH = 0    not installed
  6928.        <> 0 installed
  6929.           BX = installed component flags (test in this order!)
  6930.            bit 6   server
  6931.            bit 2   messenger
  6932.            bit 7   receiver
  6933.            bit 3   redirector
  6934. --------------------------------------------------
  6935. INT 2F - Multiplexor - Network - GET CURRENT POST ADDRESS
  6936.     AX = B803h
  6937. Return: ES:BX = post address
  6938. --------------------------------------------------
  6939. INT 2F - Multiplexor - Network - SET NEW POST ADDRESS
  6940.     AX = B804h
  6941.     ES:BX = new post address
  6942. --------------------------------------------------
  6943. INT 2F - Multiplexor - Network - VERSION CHECK
  6944.     AX = B809h
  6945.     ???
  6946. Return: ???
  6947. --------------------------------------------------
  6948. INT 2F - Multiplexor - AUTOPARK.COM - INSTALLATION CHECK
  6949.     AX = F700h
  6950. Return: AL = 00h not installed
  6951.          FFh installed
  6952. Note: AUTOPARK.COM is a resident hard disk parker by Alan D. Jones
  6953. --------------------------------------------------
  6954. INT 2F - Multiplexor - AUTOPARK.COM - SET PARKING DELAY
  6955.     AX = F701h
  6956.     BX:CX = 32 bit count of 55ms timer ticks
  6957. --------------------------------------------------
  6958. INT 30 - (NOT A VECTOR!) FAR JuMP instruction for CP/M-style calls
  6959.      the CALL 5 entry point does a FAR jump to here
  6960. --------------------------------------------------
  6961. INT 31 - overwritten by CP/M jump instruction in INT 30h
  6962. --------------------------------------------------
  6963. INT 32 - reserved
  6964. --------------------------------------------------
  6965. INT 33 - MS MOUSE - RESET DRIVER AND READ STATUS
  6966.     AX = 0000h
  6967. Return: AX = status
  6968.         0  hardware/driver not installed
  6969.         -1 hardware/driver installed
  6970.     BX = number of buttons
  6971.         -1 two buttons
  6972.         0  other than two
  6973.         3  Mouse Systems mouse
  6974. --------------------------------------------------
  6975. INT 33 - MS MOUSE - SHOW MOUSE CURSOR
  6976.     AX = 0001h
  6977. --------------------------------------------------
  6978. INT 33 - MS MOUSE - HIDE MOUSE CURSOR
  6979.     AX = 0002h
  6980. Note: multiple calls to hide the cursor will require multiple calls to
  6981.       function 01h to unhide it.
  6982. --------------------------------------------------
  6983. INT 33 - MS MOUSE - RETURN POSITION AND BUTTON STATUS
  6984.     AX = 0003h
  6985. Return: BX = button status
  6986.        bit 0  left button pressed if 1
  6987.        bit 1  right button pressed if 1
  6988.        bit 2  middle button pressed if 1 (Mouse Systems mouse)
  6989.     CX = column
  6990.     DX = row
  6991. --------------------------------------------------
  6992. INT 33 - MS MOUSE - POSITION MOUSE CURSOR
  6993.     AX = 0004h
  6994.     CX = column
  6995.     DX = row
  6996. --------------------------------------------------
  6997. INT 33 - MS MOUSE - RETURN BUTTON PRESS DATA
  6998.     AX = 0005h
  6999.     BX = button
  7000.         0 left
  7001.         1 right
  7002.         2 middle (Mouse Systems mouse)
  7003. Return: AX = button states
  7004.         bit 0 left button pressed if 1
  7005.         bit 1 right button pressed if 1
  7006.         bit 2 middle button pressed if 1 (Mouse Systems mouse)
  7007.     BX = number of times specified button has been pressed since last call
  7008.     CX = column at time specified button was last pressed
  7009.     DX = row at time specified button was last pressed
  7010. --------------------------------------------------
  7011. INT 33 - MS MOUSE - RETURN BUTTON RELEASE DATA
  7012.     AX = 0006h
  7013.     BX = button
  7014.         0 left
  7015.         1 right
  7016.         2 middle (Mouse Systems mouse)
  7017. Return: AX = button states
  7018.         bit 0 left button pressed if 1
  7019.         bit 1 right button pressed if 1
  7020.         bit 2 middle button pressed if 1 (Mouse Systems mouse)
  7021.     BX = number of times specified button has been released since last call
  7022.     CX = column at time specified button was last released
  7023.     DX = row at time specified button was last released
  7024. --------------------------------------------------
  7025. INT 33 - MS MOUSE - DEFINE HORIZONTAL CURSOR RANGE
  7026.     AX = 0007h
  7027.     CX = minimum column
  7028.     DX = maximum column
  7029. --------------------------------------------------
  7030. INT 33 - MS MOUSE - DEFINE VERTICAL CURSOR RANGE
  7031.     AX = 0008h
  7032.     CX = minimum row
  7033.     DX = maximum row
  7034. --------------------------------------------------
  7035. INT 33 - MS MOUSE - DEFINE GRAPHICS CURSOR
  7036.     AX = 0009h
  7037.     BX = column of cursor hot spot in bitmap (-16 to 16)
  7038.     CX = row of cursor hot spot (-16 to 16)
  7039.     ES:DX -> bitmap
  7040.         16 words screen mask
  7041.         16 words cursor mask
  7042.             each word defines the sixteen pixels of a row, low bit
  7043.             rightmost
  7044. --------------------------------------------------
  7045. INT 33 - MS MOUSE - DEFINE TEXT CURSOR
  7046.     AX = 000Ah
  7047.     BX = hardware/software text cursor
  7048.         0 software
  7049.         CX = screen mask
  7050.         DX = cursor mask
  7051.         1 hardware
  7052.         CX = start scan line
  7053.         DX = end scan line
  7054. Note: when the software cursor is selected, the char/attribute data at the
  7055.       current screen position is ANDed with the screen mask and then XORed
  7056.       with the cursor mask
  7057. --------------------------------------------------
  7058. INT 33 - MS MOUSE - READ MOTION COUNTERS
  7059.     AX = 000Bh
  7060. Return: CX = number of mickeys mouse moved horizontally since last call
  7061.     DX = number of mickeys mouse moved vertically
  7062. Notes: a mickey is the smallest increment the mouse can sense
  7063.        positive values indicate up/right
  7064. --------------------------------------------------
  7065. INT 33 - MS MOUSE - DEFINE INTERRUPT SUBROUTINE PARAMETERS
  7066.     AX = 000Ch
  7067.     CX = call mask
  7068.          bit 0 call if mouse moves
  7069.          bit 1 call if left button pressed
  7070.          bit 2 call if left button released
  7071.          bit 3 call if right button pressed
  7072.          bit 4 call if right button released
  7073.          bit 5 call if middle button pressed (Mouse Systems mouse)
  7074.          bit 6 call if middle button released (Mouse Systems mouse)
  7075.     ES:DX = address of FAR routine
  7076. Note: when the subroutine is called, it is passed the following values:
  7077.     AX = condition mask (same bit assignments as call mask)
  7078.     BX = button state
  7079.     CX = cursor column
  7080.     DX = cursor row
  7081.     DI = horizontal mickey count
  7082.     SI = vertical mickey count
  7083. --------------------------------------------------
  7084. INT 33 - MS MOUSE - LIGHT PEN EMULATION ON
  7085.     AX = 000Dh
  7086. --------------------------------------------------
  7087. INT 33 - MS MOUSE - LIGHT PEN EMULATION OFF
  7088.     AX = 000Eh
  7089. --------------------------------------------------
  7090. INT 33 - MS MOUSE - DEFINE MICKEY/PIXEL RATIO
  7091.     AX = 000Fh
  7092.     CX = number of mickeys per 8 pixels horizontally
  7093.     DX = number of mickeys per 8 pixels vertically
  7094. --------------------------------------------------
  7095. INT 33 - MS MOUSE - DEFINE SCREEN REGION FOR UPDATING
  7096.     AX = 0010h
  7097.     CX,DX = X,Y coordinates of upper left corner
  7098.     SI,DI = X,Y coordinates of lower right corner
  7099. Note: mouse cursor is hidden during updating, and needs to be explicitly turned
  7100.     on again
  7101. --------------------------------------------------
  7102. INT 33 - PCMOUSE - SET LARGE GRAPHICS CURSOR BLOCK
  7103.     AX = 0012h
  7104.     BH = cursor width in words
  7105.     CH = rows in cursor
  7106.     BL = horizontal hot spot (-16 to 16)
  7107.     CL = vertical hot spot (-16 to 16)
  7108.     ES:DX -> bit map of screen and cursor maps
  7109. Return: AX = -1 if successful
  7110. --------------------------------------------------
  7111. INT 33 - MS MOUSE - DEFINE DOUBLE-SPEED THRESHOLD
  7112.     AX = 0013h
  7113.     DX = threshold speed in mickeys/second, 0 = default of 64/second
  7114. Note:    if speed exceeds threshold, the cursor's on-screen motion is doubled
  7115. --------------------------------------------------
  7116. INT 33 - MS MOUSE - EXCHANGE INTERRUPT SUBROUTINES
  7117.     AX = 0014h
  7118.     ???
  7119. --------------------------------------------------
  7120. INT 33 - MS MOUSE - RETURN DRIVER STORAGE REQUIREMENTS
  7121.     AX = 0015h
  7122. Return: BX = size of buffer needed to store driver state
  7123. --------------------------------------------------
  7124. INT 33 - MS MOUSE - SAVE DRIVER STATE
  7125.     AX = 0016h
  7126.     ES:DX -> buffer for driver state
  7127. --------------------------------------------------
  7128. INT 33 - MS MOUSE - RESTORE DRIVER STATE
  7129.     AX = 0017h
  7130.     ES:DX -> buffer containing saved state
  7131. --------------------------------------------------
  7132. INT 33 - MS MOUSE - DEFINE DISPLAY PAGE NUMBER
  7133.     AX = 001Dh
  7134.     ???
  7135. --------------------------------------------------
  7136. INT 33 - MS MOUSE - RETURN DISPLAY PAGE NUMBER
  7137.     AX = 001Eh
  7138. Return: ???
  7139. --------------------------------------------------
  7140. INT 33 - PCMOUSE - GET MSMOUSE STORAGE REQUIREMENTS
  7141.     AX = 0042h
  7142. Return: AX = FFFFh successful
  7143.         BX = buffer size in bytes for functions 50h and 52h
  7144.        = 0     MSMOUSE not installed
  7145.        = 42h functions 42h, 50h, and 52h not supported
  7146. --------------------------------------------------
  7147. INT 33 - PCMOUSE - SAVE MSMOUSE STATE
  7148.     AX = 0050h
  7149.     BX = buffer size
  7150.     ES:DX -> buffer
  7151. Return: AX = FFFFh if successful
  7152. --------------------------------------------------
  7153. INT 33 - PCMOUSE - RESTORE MSMOUSE STATE
  7154.     AX = 0052h
  7155.     BX = buffer size
  7156.     ES:DX -> buffer
  7157. Return: AX = FFFFh if successful
  7158. --------------------------------------------------
  7159. INT 34 - Turbo C/Microsoft languages - Floating Point emulation
  7160.     This interrupt emulates opcode D8h
  7161. --------------------------------------------------
  7162. INT 35 - Turbo C/Microsoft languages - Floating Point emulation
  7163.     This interrupt emulates opcode D9h
  7164. --------------------------------------------------
  7165. INT 36 - Turbo C/Microsoft languages - Floating Point emulation
  7166.     This interrupt emulates opcode DAh
  7167. --------------------------------------------------
  7168. INT 37 - Turbo C/Microsoft languages - Floating Point emulation
  7169.     This interrupt emulates opcode DBh
  7170. --------------------------------------------------
  7171. INT 38 - Turbo C/Microsoft languages - Floating Point emulation
  7172.     This interrupt emulates opcode DCh
  7173. --------------------------------------------------
  7174. INT 39 - Turbo C/Microsoft languages - Floating Point emulation
  7175.     This interrupt emulates opcode DDh
  7176. --------------------------------------------------
  7177. INT 3A - Turbo C/Microsoft languages - Floating Point emulation
  7178.     This interrupt emulates opcode DEh
  7179. --------------------------------------------------
  7180. INT 3B - Turbo C/Microsoft languages - Floating Point emulation
  7181.     This interrupt emulates opcode DFh
  7182. --------------------------------------------------
  7183. INT 3C - Turbo C/Microsoft languages - Floating Point emulation
  7184.     This interrupt emulates instructions with an ES segment override
  7185. --------------------------------------------------
  7186. INT 3D - Turbo C/Microsoft languages - Floating Point emulation
  7187.     This interrupt emulates a standalone FWAIT instruction
  7188. --------------------------------------------------
  7189. INT 3E - Turbo C/Microsoft languages - Floating Point emulation
  7190. --------------------------------------------------
  7191. INT 3F - Overlay manager interrupt (Microsoft LINK.EXE)
  7192. --------------------------------------------------
  7193. INT 40 - Hard disk - Relocated Floppy Handler (original INT 13h)
  7194. --------------------------------------------------
  7195. INT 41 - FIXED DISK PARAMETERS (XT,AT,XT2,XT286,PS except ESDI disks)
  7196.     WORD    cylinders
  7197.     BYTE    heads
  7198.     WORD    starting reduced write current cylinder (XT only, 0 for others)
  7199.     WORD    starting write pre-comp cylinder
  7200.     BYTE    maximum ECC burst length
  7201.     BYTE    control byte
  7202.            bits 0-2: drive option (XT only, 0 for others)
  7203.            bit 3:    set if more than 8 heads
  7204.            bit 4:    always 0
  7205.            bit 5:    set if manufacturer's defect map on max cylinder+1
  7206.            bit 6:    disable ECC retries
  7207.            bit 7:    disable access retries
  7208.     BYTE    standard timeout (XT only, 0 for others)
  7209.     BYTE    formatting timeout (XT only, 0 for others)
  7210.     BYTE    timeout for checking drive (XT only, 0 for others)
  7211.     WORD    landing zone (AT/PS2)
  7212.     BYTE    sectors/track (AT/PS2)
  7213.     BYTE    0
  7214. --------------------------------------------------
  7215. INT 42 - EGA/VGA/PS - Relocated (by EGA) Video Handler (original INT 10h)
  7216. --------------------------------------------------
  7217. INT 42 - Z100 - ???
  7218. --------------------------------------------------
  7219. INT 43 - EGA/VGA/PS - User font table
  7220. --------------------------------------------------
  7221. INT 44 - EGA/VGA/CONV/PS - EGA/PCjr fonts, characters 00h to 7Fh
  7222. --------------------------------------------------
  7223. INT 44 - Novell NetWare - HIGH-LEVEL LANGUAGE API
  7224. --------------------------------------------------
  7225. INT 44 - Z100 - ???
  7226. --------------------------------------------------
  7227. INT 45 - Z100 - ???
  7228. --------------------------------------------------
  7229. INT 46 - Secondary Fixed Disk Params (see INT 41h) (AT,XT286,PS except ESDI)
  7230. --------------------------------------------------
  7231. INT 46 - Z100 - ???
  7232. --------------------------------------------------
  7233. INT 47 - reserved
  7234. --------------------------------------------------
  7235. INT 48 - PCjr - Cordless Keyboard Translation
  7236. --------------------------------------------------
  7237. INT 49 - PCjr - Non-keyboard Scan Code Translation Table
  7238. --------------------------------------------------
  7239. INT 4A - AT/CONV/PS - User Alarm
  7240.     Invoked by BIOS when real-time clock alarm occurs
  7241. --------------------------------------------------
  7242. INT 4B - reserved
  7243. --------------------------------------------------
  7244. INT 4C - reserved
  7245. --------------------------------------------------
  7246. INT 4D - reserved
  7247. --------------------------------------------------
  7248. INT 4E - reserved
  7249. --------------------------------------------------
  7250. INT 4F - reserved
  7251. --------------------------------------------------
  7252. INT 50 to 57 - IRQ0-IRQ7 relocated by DESQview
  7253. --------------------------------------------------
  7254. INT 50 to 57 - IRQ0-IRQ7 relocated by IBM 3278 emulation control program     
  7255. --------------------------------------------------
  7256. INT 58 - reserved
  7257. --------------------------------------------------
  7258. INT 59 - GSS Computer Graphics Interface (GSS*CGI)
  7259.     DS:DX = Pointer to block of 5 array pointers
  7260. Return:    CF set on error
  7261.         AX = error code
  7262.     CF clear if successful
  7263.         AX = return code
  7264. Note: INT 59 is the means by which GSS*CGI language bindings communicate with
  7265.       GSS*CGI device drivers and the GSS*CGI device driver controller.    also
  7266.       used by the IBM Graphic Development Toolkit
  7267. --------------------------------------------------
  7268. INT 5A - Cluster adapter BIOS entry address
  7269.     ???
  7270. --------------------------------------------------
  7271. INT 5B - Used by cluster adapter
  7272. --------------------------------------------------
  7273. INT 5C - NETBIOS INTERFACE
  7274.     ES:BX -> Network Control Block
  7275.     Subfunction in first NCB field (or with 80h for non-waiting call)
  7276.         10h start session with NCB_NAME name (call)
  7277.         11h listen for call
  7278.         12h end session with NCB_NAME name (hangup)
  7279.         14h send data via NCB_LSN
  7280.         15h receive data from a session
  7281.         16h receive data from any session
  7282.         17h send multiple data buffers
  7283.         20h send unACKed message (datagram)
  7284.         21h receive datagram
  7285.         22h send broadcast datagram
  7286.         23h receive broadcast datagram
  7287.         30h add name to name table
  7288.         31h delete name from name table
  7289.         32h reset adapter card and tables
  7290.         33h    get adapter status
  7291.         34h status of all sessions for name
  7292.         35h cancel
  7293.         36h add group name to name table
  7294.         70h unlink from IBM remote program (no F0h function)
  7295.         71h send data without ACK
  7296.         72h send multiple buffers without ACK
  7297.         78h find name
  7298.         79h token-ring protocol trace
  7299. Return: AL = status
  7300.         00h successful
  7301.         01h bad buffer size
  7302.         03h invalid NETBIOS command
  7303.         05h timeout
  7304.         06h receive buffer too small
  7305.         08h bad session number
  7306.         09h LAN card out of memory
  7307.         0Ah session closed
  7308.         0Bh command has been cancelled
  7309.         0Dh name already exists
  7310.         0Eh local name table full
  7311.         0Fh name still in use, can't delete
  7312.         11h local session table full
  7313.         12h remote PC not listening
  7314.         13h bad NCB_NUM field
  7315.         14h no answer to CALL or no such remote
  7316.         15h name not in local name table
  7317.         16h duplicate name
  7318.         17h bad delete
  7319.         18h abnormal end
  7320.         19h name error, multiple identical names in use
  7321.         1Ah bad packet
  7322.         21h network card busy
  7323.         22h too many commands queued
  7324.         23h bad LAN card number
  7325.         24h command finished while cancelling
  7326.         26h command can't be cancelled
  7327.         FFh NETBIOS busy
  7328.  
  7329. Structure of Network Control Block:
  7330.     BYTE  ncb_command
  7331.     BYTE  ncb_retcode
  7332.     BYTE  ncb_lsn
  7333.     BYTE  ncb_num
  7334.     DWORD -> ncb_buffer
  7335.     WORD  ncb_length
  7336.      16 BYTEs ncb_callname
  7337.      16 BYTEs ncb_name
  7338.     BYTE  ncb_rto
  7339.     BYTE  ncb_sto
  7340.     DWORD -> ncb_post      /* int (far *ncb_post)(); */
  7341.     BYTE  ncb_lana_num
  7342.     BYTE  ncb_cmd_cplt
  7343.      14 BYTEs ncb_reserve
  7344.  
  7345. Structure name:
  7346.      16 BYTEs nm_name
  7347.     BYTE  nm_num
  7348.     BYTE  nm_status
  7349.  
  7350. Structure astatus:
  7351.       6 BYTEs as_id
  7352.     BYTE  as_jumpers
  7353.     BYTE  as_post
  7354.     BYTE  as_major
  7355.     BYTE  as_minor
  7356.     WORD  as_interval
  7357.     WORD  as_crcerr
  7358.     WORD  as_algerr
  7359.     WORD  as_colerr
  7360.     WORD  as_abterr
  7361.     DWORD as_tcount
  7362.     DWORD as_rcount
  7363.     WORD  as_retran
  7364.     WORD  as_xresrc
  7365.       8 BYTEs as_res0
  7366.     WORD  as_ncbfree
  7367.     WORD  as_ncbmax
  7368.     WORD  as_ncbx
  7369.       4 BYTEs as_res1
  7370.     WORD  as_sespend
  7371.     WORD  as_msp
  7372.     WORD  as_sesmax
  7373.     WORD  as_bufsize
  7374.     WORD  as_names
  7375.      16 name structures  as_name
  7376.  
  7377. Note: Sytek PCnet card uses DMA 3.
  7378. --------------------------------------------------
  7379. INT 5C - TOPS INTERFACE
  7380.     ES:BX -> Network Control Block
  7381. Note: TOPS card uses DMA 1, 3 or none.
  7382. --------------------------------------------------
  7383. INT 5D - reserved
  7384. --------------------------------------------------
  7385. INT 5E - reserved
  7386. --------------------------------------------------
  7387. INT 5F - reserved
  7388. --------------------------------------------------
  7389. INT 60 - reserved for user interrupt
  7390. --------------------------------------------------
  7391. INT 60 - FTP Driver - PC/TCP Packet Driver Specification
  7392.    The handler for the interrupt will start with a 3-byte jump instruction, 
  7393.    followed by the ASCIZ string "PKT DRVR".  To find the interrupt being used
  7394.    by the driver, an application should scan through interrupt vectors 60h to
  7395.    80h until it finds one with the "PKT DRVR" string.
  7396.  
  7397. Network Interface classes/types:
  7398.     Class 01h  Ethernet/IEEE 802.3     
  7399.     01h 3COM 3C500/3C501
  7400.     02h 3COM 3C505
  7401.     03h MICOM-Interlan NI5010
  7402.     04h BICC Data Networks 4110
  7403.     05h BICC Data Networks 4117
  7404.     06h MICOM-Interlan NP600
  7405.     08h Ungermann-Bass PC-NIC
  7406.     09h Univation NC-516
  7407.     0Ah TRW PC-2000    
  7408.     0Bh MICOM-Interlan NI5210
  7409.     0Ch 3COM 3C503
  7410.     0Dh 3COM 3C523
  7411.     0Eh Western Digital WD8003
  7412.     0Fh Spider Systems S4
  7413.     Class 02h  ProNET-10
  7414.     01h Proteon p1300
  7415.     Class 03h  IEEE 802.5/ProNet-4
  7416.     01h IBM Token-Ring Adapter
  7417.     02h Proteon p1340
  7418.     03h Proteon p1344
  7419.     Class 04h  Omninet
  7420.     Class 05h  Appletalk
  7421.     Class 06h  Serial Line
  7422.     Class 07h  StarLAN
  7423.     Class 08h  ARCnet
  7424.     01h Datapoint RIM    
  7425. --------------------------------------------------
  7426. INT 60 - FTP Driver - DRIVER INFO
  7427.     AX = 01FFh
  7428.     BX = handler returned by function 02h
  7429. Return: CF set on error
  7430.         DH = error code
  7431.         01h invalid handle number
  7432.         02h no interfaces of the specified class found
  7433.         03h no interfaces of the specified type found
  7434.         04h no interfaces of the specified number found
  7435.         05h bad packet type
  7436.         06h interface does not support multicast messages
  7437.         07h this packet driver cannot terminate
  7438.         08h invalid receiver mode
  7439.         09h insufficient space
  7440.         0Ah type accessed but never released
  7441.         0Bh bad command
  7442.         0Ch packet could not be sent
  7443.     CF clear if successful
  7444.         BX = version
  7445.         CH = class            
  7446.         DX = type
  7447.         CL = number
  7448.         DS:SI -> name
  7449.         AL = driver type
  7450.         01h basic
  7451.         02h extended
  7452.         FFh not installed
  7453. --------------------------------------------------
  7454. INT 60 - FTP Driver - ACCESS TYPE
  7455.     AH = 02h
  7456.     AL = interface class
  7457.     BX = interface type
  7458.     DL = interface number
  7459.     DS:SI -> type
  7460.     CX = length of type
  7461.     ES:DI -> receiver
  7462. Return: CF set on error
  7463.         DH = error code (see above)
  7464.     CF clear if successful
  7465.         AX = handle            
  7466.  
  7467. Receiver called with
  7468.     AX = subfunction
  7469.         00h application to return pointer to buffer in ES:DI
  7470.         ES:DI = 0:0 means throw away packet
  7471.         01h copy to DS:SI buffer completed
  7472.     BX = handle
  7473.     CX = buffer length
  7474. when a packet is received
  7475. --------------------------------------------------
  7476. INT 60 - FTP Driver - RELEASE TYPE
  7477.     AH = 03h
  7478.     BX = handle
  7479. Return: CF set on error
  7480.        DH = error code (see above)
  7481.     CF clear if successful    
  7482. --------------------------------------------------
  7483. INT 60 - FTP Driver - SEND PACKET
  7484.     AH = 04h
  7485.     DS:SI -> buffer
  7486.     CX = length
  7487. Return: CF set on error
  7488.         DH = error code (see above)
  7489. --------------------------------------------------
  7490. INT 60 - FTP Driver - TERMINATE DRIVER FOR HANDLE
  7491.     AH = 05h
  7492.     BX = handle
  7493. Return: CF set on error
  7494.        DH = error code (see above)
  7495. --------------------------------------------------
  7496. INT 60 - FTP Driver - GET ADDRESS
  7497.     AH = 06h
  7498.     BX = handle
  7499.     ES:DI -> buffer
  7500.     CX = length
  7501. Return: CF set on error
  7502.         DH = error code (see above)
  7503.     CF clear if successful
  7504.         CX = length    
  7505. Note: copies the local net address associated with the handle into the buffer        
  7506. --------------------------------------------------
  7507. INT 60 - FTP Driver - RESET INTERFACE
  7508.     AH = 07h
  7509.     BX = handle
  7510. Return: CF set on error
  7511.         DH = error code (see above)
  7512. --------------------------------------------------
  7513. INT 60 - 10-NET - LOCK AND WAIT
  7514.     AH = 11h
  7515.     AL = drive number or 0
  7516.     DX = number of seconds to wait
  7517.     ES:SI = Ethernet address or 0
  7518.     DS:BX -> 31-byte ASCIZ semaphore name
  7519. Return: AL = status
  7520.         0 successful
  7521.         1 timeout
  7522.         2 server not responding
  7523.         3 invalid semaphore name
  7524.         4 semaphore list is full
  7525.         5 invalid drive ID
  7526.         6 invalid Ethernet address
  7527.         7 not logged in
  7528.         8 write to network failed
  7529.         9 semaphore already logged for this CPU
  7530. --------------------------------------------------
  7531. INT 60 - 10-NET - LOCK
  7532.     AH = 12h
  7533.     AL = drive number or 0
  7534.     ES:SI = Ethernet address or 0
  7535.     DS:BX -> 31-byte ASCIZ semaphore name
  7536. Return: AL = status (see function 11h)
  7537.         1 semaphore currently logged
  7538. Note: unlike function 11h, this function returns immediately
  7539. --------------------------------------------------
  7540. INT 60 - 10-NET - UNLOCK
  7541.     AH = 13h
  7542.     AL = drive number or 0
  7543.     ES:SI = Ethernet address or 0
  7544.     DS:BX -> 31-byte ASCIZ semaphore name
  7545. Return: AL = status (see function 11h)
  7546.         1 semaphore not logged
  7547. --------------------------------------------------
  7548. INT 60 - FTP Driver - SET RECEIVE MODE
  7549.     AH = 20h
  7550.     BX = handle
  7551.     CX = mode
  7552.         01h turn off receiver
  7553.         02h receive only packets sent to this interface
  7554.         03h mode 2 plus broadcast packets
  7555.         04h mode 3 plus limited multicast packets
  7556.         05h mode 3 plus all multicast packets
  7557.         06h all packets
  7558. Return: CF set on error
  7559.        DH = error code
  7560.            
  7561. --------------------------------------------------
  7562. INT 60 - FTP Driver - GET RECEIVE MODE
  7563.     AH = 21h
  7564.     BX = handle
  7565. Return: CF set on error
  7566.         DH = error code (see function 01h above)
  7567.     CF clear if successful
  7568.         AX = mode    
  7569. --------------------------------------------------
  7570. INT 60 - FTP Driver - GET STATISTICS
  7571.     AH = 24h
  7572.     BX = handle
  7573. Return: CF set on error
  7574.         DH = error code
  7575.     CF clear if successful
  7576.         DS:SI -> statistics
  7577.         DWORD packets in
  7578.         DWORD packets out
  7579.         DWORD bytes in
  7580.         DWORD bytes out
  7581.         DWORD errors in
  7582.         DWORD errors out
  7583.         DWORD packets dropped    
  7584. --------------------------------------------------
  7585. INT 61 - reserved for user interrupt
  7586. --------------------------------------------------
  7587. INT 62 - reserved for user interrupt
  7588. --------------------------------------------------
  7589. INT 63 - reserved for user interrupt
  7590. --------------------------------------------------
  7591. INT 64 - reserved for user interrupt
  7592. --------------------------------------------------
  7593. INT 65 - reserved for user interrupt
  7594. --------------------------------------------------
  7595. INT 66 - reserved for user interrupt
  7596. --------------------------------------------------
  7597. INT 67 - LIM EMS - GET MANAGER STATUS
  7598.     AH = 40h
  7599. Return: AH = status
  7600.         00h successful
  7601.         80h internal error
  7602.         81h hardware malfunction
  7603.         84h undefined function requested by application
  7604. Note: this call can be used only after establishing that the EMS driver
  7605.       is in fact present
  7606. --------------------------------------------------
  7607. INT 67 - LIM EMS - GET PAGE FRAME SEGMENT
  7608.     AH = 41h
  7609. Return: AH = 00h function successful
  7610.         BX = segment of page frame
  7611.     AH = error code (see AH=40h above)
  7612. --------------------------------------------------
  7613. INT 67 - LIM EMS - GET NUMBER OF PAGES
  7614.     AH = 42h
  7615. Return: AH = 00h function successful
  7616.         BX = number of unallocated pages
  7617.         DX = total number of pages
  7618.     AH = error code (see AH=40h above)
  7619. --------------------------------------------------
  7620. INT 67 - LIM EMS - GET HANDLE AND ALLOCATE MEMORY
  7621.     AH = 43h
  7622.     BX = number of logical pages to allocate
  7623. Return: AH = status
  7624.         00h function successful
  7625.         DX = handle
  7626.         80h internal error
  7627.         81h hardware malfunction
  7628.         84h undefined function requested
  7629.         85h no more handles available
  7630.         87h more pages requested than physically exist
  7631.         88h more pages requested than currently available
  7632.         89h zero pages requested
  7633. --------------------------------------------------
  7634. INT 67 - LIM EMS - MAP MEMORY
  7635.     AH = 44h
  7636.     AL = physical page number (0-3)
  7637.     BX = logical page number
  7638.     DX = handle
  7639. Return: AH = status
  7640.         00h function successful
  7641.         80h internal error
  7642.         81h hardware malfunction
  7643.         83h invalid handle
  7644.         84h undefined function requested
  7645.         8Ah invalid logical page number
  7646.         8Bh illegal physical-page number
  7647. --------------------------------------------------
  7648. INT 67 - LIM EMS - RELEASE HANDLE AND MEMORY
  7649.     AH = 45h
  7650.     DX = EMM handle
  7651. Return: AH = status
  7652.         00h successful
  7653.         80h internal error
  7654.         81h hardware malfunction
  7655.         83h invalid handle
  7656.         84h undefined function requested
  7657.         86h error in save or restore of mapping context
  7658. --------------------------------------------------
  7659. INT 67 - LIM EMS - GET EMM VERSION
  7660.     AH = 46h
  7661. Return: AH = status
  7662.         00h successful
  7663.         AL = EMM version number
  7664.         80h internal error
  7665.         81h hardware malfunction
  7666.         84h undefined function requested
  7667. --------------------------------------------------
  7668. INT 67 - LIM EMS - SAVE MAPPING CONTEXT
  7669.     AH = 47h
  7670.     DX = handle
  7671. Return: AH = status
  7672.         00h successful
  7673.         80h internal error
  7674.         81h hardware malfunction
  7675.         83h invalid handle
  7676.         84h undefined function requested
  7677.         8Ch page-mapping hardware state save area is full
  7678.         8Dh save of mapping context failed
  7679. --------------------------------------------------
  7680. INT 67 - LIM EMS - RESTORE MAPPING CONTEXT
  7681.     AH = 48h
  7682.     DX = handle
  7683. Return: AH = status
  7684.         00h successful
  7685.         80h internal error
  7686.         81h hardware malfunction
  7687.         83h invalid handle
  7688.         84h undefined function requested
  7689.         8Eh restore of mapping context failed
  7690. --------------------------------------------------
  7691. INT 67 - LIM EMS - reserved - GET I/O PORT ADDRESSES
  7692.     AH = 49h
  7693. Note: defined in EMS 3.0, but undocumented in EMS 3.2
  7694. --------------------------------------------------
  7695. INT 67 - LIM EMS - reserved - GET TRANSLATION ARRAY
  7696.     AH = 4Ah
  7697. Note: defined in EMS 3.0, but undocumented in EMS 3.2
  7698. --------------------------------------------------
  7699. INT 67 - LIM EMS - GET NUMBER OF EMM HANDLES
  7700.     AH = 4Bh
  7701. Return: AH = status
  7702.         00h successful
  7703.         BX = number of EMM handles
  7704.         80h internal error
  7705.         81h hardware malfunction
  7706.         83h invalid handle
  7707.         84h undefined function requested
  7708. --------------------------------------------------
  7709. INT 67 - LIM EMS - GET PAGES OWNED BY HANDLE
  7710.     AH = 4Ch
  7711.     DX = EMM handle
  7712. Return: AH = status
  7713.         00h successful
  7714.         BX = number of logical pages
  7715.         80h internal error
  7716.         81h hardware malfunction
  7717.         83h invalid handle
  7718.         84h undefined function requested
  7719. --------------------------------------------------
  7720. INT 67 - LIM EMS - GET PAGES FOR ALL HANDLES
  7721.     AH = 4Dh
  7722.     ES:DI -> array to receive information
  7723. Return: AH = status
  7724.         00h successful
  7725.         BX = number of active EMM handles
  7726.         array filled with 2-word entries, consisting of a handle
  7727.           and the number of pages allocated to that handle
  7728.         80h internal error
  7729.         81h hardware malfunction
  7730.         84h undefined function requested
  7731. --------------------------------------------------
  7732. INT 67 - LIM EMS - GET OR SET PAGE MAP
  7733.     AH = 4Eh
  7734.     AL = 00h if getting mapping registers
  7735.          01h if setting mapping registers
  7736.          02h if getting and setting mapping registers at once
  7737.          03h if getting size of page-mapping array
  7738.     DS:SI -> array holding information (AL=01/02)
  7739.     ES:DI -> array to receive information (AL=00/02)
  7740. Return: AH = status
  7741.         00h successful
  7742.         AL = bytes in page-mapping array (subfunction 03h only)
  7743.         array pointed to by ES:DI receives mapping info (AL=00/02)
  7744.         80h internal error
  7745.         81h hardware malfunction
  7746.         84h undefined function requested
  7747.         8Fh undefined subfunction parameter
  7748.         A3h contents of source array corrupted (EMS 4.0?)
  7749. Note: this function was designed to be used by multitasking operating systems
  7750.       and should not ordinarily be used by appplication software.
  7751. --------------------------------------------------
  7752. INT 67 - LIM EMS 4.0 - GET/SET PARTIAL PAGE MAP
  7753.     AH = 4Fh
  7754.     AL = subfunction
  7755.         00h get partial page map
  7756.            DS:SI -> structure containing list of segments whose mapping
  7757.             contexts are to be saved
  7758.            ES:DI -> array to receive page map
  7759.         01h set partial page map
  7760.            DS:SI -> structure containing saved partial page map
  7761.         02h get size of partial page map
  7762.            BX = number of mappable segments in the partial map to be saved
  7763. Return: AH = status
  7764.         00h successful
  7765.         80h internal error
  7766.         81h hardware malfunction
  7767.         84h undefined function requested
  7768.         8Bh one of specified segments is not mappable
  7769.         8Fh undefined subfunction parameter
  7770.         A3h contents of partial page map corrupted or count of mappable
  7771.         segments exceeds total number of mappable segments in system
  7772.     AL = size of partial page map for subfunction 02h
  7773. --------------------------------------------------
  7774. INT 67 - LIM EMS 4.0 - MAP/UNMAP MULTIPLE HANDLE PAGES
  7775.     AH = 50h
  7776.     AL = subfunction
  7777.         00h
  7778.         01h
  7779.     DX = handle
  7780.     CX = number of entries in array
  7781.     DS:SI -> mapping array
  7782. Return: AH = status
  7783.         00h successful
  7784.         80h internal error
  7785.         81h hardware malfunction
  7786.         83h invalid handle
  7787.         84h undefined function requested
  7788.         8Ah one or more logical pages are invalid
  7789.         8Bh one or more physical pages are invalid
  7790.         8Fh invalid subfunction
  7791. --------------------------------------------------
  7792. INT 67 - LIM EMS 4.0 - REALLOCATE PAGES
  7793.     AH = 51h
  7794.     DX = handle
  7795.     BX = number of pages to be allocated to handle
  7796. Return: BX = actual number of pages allocated to handle
  7797.     AH = status
  7798.         00h successful
  7799.         80h internal error
  7800.         81h hardware malfunction
  7801.         83h invalid handle
  7802.         84h undefined function requested
  7803.         87h more pages requested than present in system
  7804.         88h more pages requested than currently available
  7805. --------------------------------------------------
  7806. INT 67 - LIM EMS 4.0 - GET/SET HANDLE ATTRIBUTES
  7807.     AH = 52h
  7808.     AL = subfunction
  7809.         00h get handle attributes
  7810.         01h set handle attributes
  7811.            BL = new attribute (see returned AL)
  7812.         02h get attribute capability
  7813.     DX = handle
  7814. Return: AL = attribute (for subfunction 00h)
  7815.         00h handle is volatile
  7816.         01h handle is nonvolatile
  7817.     AL = attribute capability (for subfunction 02h)
  7818.         00h only volatile handles supported
  7819.         01h both volatile and non-volatile supported
  7820.     AH = status
  7821.         00h successful
  7822.         80h internal error
  7823.         81h hardware malfunction
  7824.         83h invalid handle
  7825.         84h undefined function requested
  7826.         8Fh undefined subfunction
  7827.         90h undefined attribute type
  7828.         91h feature not supported
  7829. --------------------------------------------------
  7830. INT 67 - LIM EMS 4.0 - GET/SET HANDLE NAME
  7831.     AH = 53h
  7832.     AL = subfunction
  7833.         00h get handle name
  7834.            ES:DI -> 8-byte handle name array
  7835.         01h set handle name
  7836.            DS:SI -> 8-byte handle name
  7837.     DX = handle
  7838. Return: AH = status
  7839.         00h successful
  7840.         80h internal error
  7841.         81h hardware malfunction
  7842.         83h invalid handle
  7843.         84h undefined function requested
  7844.         8Fh undefined subfunction
  7845.         A1h duplicate handle name
  7846. --------------------------------------------------
  7847. INT 67 - LIM EMS 4.0 - GET HANDLE DIRECTORY
  7848.     AH = 54h
  7849.     AL = subfunction
  7850.         00h get handle directory
  7851.            ES:DI -> buffer for handle directory
  7852.         01h search for named handle
  7853.            DS:SI -> 8-byte name
  7854.         02h get total number of handles
  7855. Return: AL = number of entries in handle directory (subfunction 00h)
  7856.     DX = value of named handle (subfunction 01h)
  7857.     BX = total number of handles (subfunction 02h)
  7858.     AH = status
  7859.         00h successful
  7860.         80h internal error
  7861.         81h hardware malfunction
  7862.         84h undefined function requested
  7863.         8Fh undefined subfunction
  7864.         A0h no such handle name
  7865.         A1h a handle found had no name
  7866. --------------------------------------------------
  7867. INT 67 - LIM EMS 4.0 - ALTER PAGE MAP AND JUMP
  7868.     AH = 55h
  7869.     AL = subfunction
  7870.         00h physical page numbers provided by caller
  7871.         01h segment addresses provided by caller
  7872.     DX = handle
  7873.     DS:SI -> structure containing map and jump address
  7874. Return: (at target address unless error)
  7875.     AH = status
  7876.         00h successful
  7877.         80h internal error
  7878.         81h hardware failure
  7879.         83h invalid handle
  7880.         84h undefined function requested
  7881.         8Ah invalid logical page number encountered
  7882.         8Bh invalid physical page number encountered
  7883.         8Fh invalid subfunction
  7884. --------------------------------------------------
  7885. INT 67 - LIM EMS 4.0 - ALTER PAGE MAP AND CALL
  7886.     AH = 56h
  7887.     AL = subfunction
  7888.         00h physical page numbers provided by caller
  7889.            DX = handle
  7890.            DS:SI -> structure containing page map and call address
  7891.         01h segment addresses provided by caller
  7892.            DX = handle
  7893.            DS:SI -> structure containing page map and call address
  7894.         02h get page map stack space required
  7895. Return: (if successful, the target address is called.  Use a RETF to return and
  7896.      restore mapping context)
  7897.     BX = stack space required (subfunction 02h)
  7898.     AH = status
  7899.         00h successful
  7900.         80h internal error
  7901.         81h hardware failure
  7902.         83h invalid handle
  7903.         84h undefined function requested
  7904.         8Ah invalid logical page number encountered
  7905.         8Bh invalid physical page number encountered
  7906.         8Fh undefined subfunction
  7907. --------------------------------------------------
  7908. INT 67 - LIM EMS 4.0 - MOVE/EXCHANGE MEMORY REGION
  7909.     AH = 57h
  7910.     AL = subfunction
  7911.         00h move memory region
  7912.         01h exchange memory region
  7913.     DS:SI -> structure describing source and destination
  7914. Return: AH = status
  7915.         00h successful
  7916.         80h internal error
  7917.         81h hardware failure
  7918.         83h invalid handle
  7919.         84h undefined function requested
  7920.         8Ah invalid logical page number encountered
  7921.         8Fh undefined subfunction
  7922.         92h successful, but a portion of the source region has been
  7923.         overwritten
  7924.         93h length of source or destination region exceeds length of region
  7925.         allocated to either source or destination handle
  7926.         94h conventional and expanded memory regions overlap
  7927.         95h offset within logical page exceeds size of logical page
  7928.         96h region length exceeds 1M
  7929.         97h source and destination EMS regions have same handle and overlap
  7930.         98h memory source or destination type undefined
  7931.         A2h attempted to wrap around 1M conventional address space
  7932. --------------------------------------------------
  7933. INT 67 - LIM EMS 4.0 - GET MAPPABLE PHYSICAL ADDRESS ARRAY
  7934.     AH = 58h
  7935.     AL = subfunction
  7936.         00h get mappable physical address array
  7937.            ES:DI -> buffer to be filled with array
  7938.         01h get number of entries in m.p.a. array
  7939. Return: CX = number of entries in array
  7940.     AH = status
  7941.         00h successful
  7942.         80h internal error
  7943.         81h hardware failure
  7944.         84h undefined function requested
  7945.         8Fh undefined subfunction
  7946. --------------------------------------------------
  7947. INT 67 - LIM EMS 4.0 - GET EXPANDED MEMORY HARDWARE INFORMATION
  7948.     AH = 59h
  7949.     AL = subfunction
  7950.         00h get hardware configuration array
  7951.            ES:DI -> buffer to be filled with array
  7952.         01h get unallocated raw page count
  7953. Return: BX = unallocated raw pages (subfunction 01h)
  7954.     DX = total raw pages (subfunction 01h)
  7955.     AH = status
  7956.         00h successful
  7957.         80h internal error
  7958.         81h hardware failure
  7959.         84h undefined function requested
  7960.         8Fh undefined subfunction
  7961.         A4h access denied by operating system
  7962. Note: subfunction 00h is for use by operating systems only, and can be
  7963.       enabled or disabled at any time by the operating system
  7964. --------------------------------------------------
  7965. INT 67 - LIM EMS 4.0 - ALLOCATE STANDARD/RAW PAGES
  7966.     AH = 5Ah
  7967.     AL = subfunction
  7968.         00h allocate standard pages
  7969.         01h allocate raw pages
  7970.     BX = number of pages to allocate
  7971. Return: DX = handle
  7972.     AH = status
  7973.         00h successful
  7974.         80h internal error
  7975.         81h hardware failure
  7976.         84h undefined function requested
  7977.         85h no more handles available
  7978.         87h insufficient memory pages in system
  7979.         88h insufficient memory pages available
  7980.         8Fh undefined subfunction
  7981. --------------------------------------------------
  7982. INT 67 - LIM EMS 4.0 - ALTERNATE MAP REGISTER SET
  7983.     AH = 5Bh
  7984.     AL = subfunction
  7985.         00h get alternate map register set
  7986.         01h set alternate map register set
  7987.            BL = new alternate map register set number
  7988.            ES:DI -> map register context save area if BL=0
  7989.         02h get alternate map save array size
  7990.         03h allocate alternate map register set
  7991.         04h deallocate alternate map register set
  7992.            BL = number of alternate map register set
  7993. Return: BL = current active alternate map register set number if nonzero (AL=0)
  7994.     ES:DI -> map register context save area if BL=0 (AL=0)
  7995.     DX = array size in bytes (subfunction 02h)
  7996.     BL = number of alternate map register set; zero if not supported (AL=3)
  7997.     AH = status
  7998.         00h successful
  7999.         80h internal error
  8000.         81h hardware malfunction
  8001.         84h undefined function requested
  8002.         8Fh undefined subfunction
  8003.         9Ah specified alternate map register set not supported
  8004.         9Bh all alternate map register sets currently allocated
  8005.         9Ch alternate map register sets not supported
  8006.         9Dh undefined or unallocated alternate map register set
  8007.         A3h source array corrupted
  8008.         A4h operating system denied access
  8009. Note: this function is for use by operating systems only, and can be
  8010.       enabled or disabled at any time by the operating system
  8011. --------------------------------------------------
  8012. INT 67 - LIM EMS 4.0 - ALTERNATE MAP REGISTER SET - DMA REGISTERS
  8013.     AH = 5Bh
  8014.     AL = subfunction
  8015.         05h allocate DMA register set
  8016.         06h enable DMA on alternate map register set
  8017.            BL = DMA register set number
  8018.            DL = DMA channel number
  8019.         07h disable DMA on alternate map register set
  8020.            BL = DMA register set number
  8021.         08h deallocate DMA register set
  8022.            BL = DMA register set number
  8023. Return: BL = DMA register set number; zero if not supported (subfunction 05h)
  8024.     AH = status
  8025.         00h successful
  8026.         80h internal error
  8027.         81h hardware malfunction
  8028.         84h undefined function requested
  8029.         8Fh undefined subfunction
  8030.         9Ah specified DMA register set not supported
  8031.         9Bh all DMA register sets currently allocated
  8032.         9Ch alternate DMA sets not supported
  8033.         9Dh undefined or unallocated DMA register set
  8034.         9Eh dedicated DMA channels not supported
  8035.         9Fh specified dedicated DMA channel not supported
  8036.         A3h source array corrupted
  8037.         A4h operating system denied access
  8038. Note: this function is for use by operating systems only, and can be
  8039.       enabled or disabled at any time by the operating system
  8040. --------------------------------------------------
  8041. INT 67 - LIM EMS 4.0 - PREPARE EXPANDED MEMORY HARDWARE FOR WARM BOOT
  8042.     AH = 5Ch
  8043. Return: AH = status
  8044.         00h successful
  8045.         80h internal error
  8046.         81h hardware malfunction
  8047.         84h undefined function requested
  8048. --------------------------------------------------
  8049. INT 67 - LIM EMS 4.0 - ENABLE/DISABLE OS FUNCTION SET FUNCTIONS
  8050.     AH = 5Dh
  8051.     AL = subfunction
  8052.         00h enable OS Function Set
  8053.         01h disable OS Function Set
  8054.         02h return access key (resets memory manager, returns access key at
  8055.         next invocation)
  8056.     BX,CX = access key returned by first invocation
  8057. Return: BX,CX = access key, returned only on first invocation of function
  8058.     AH = status
  8059.         00h successful
  8060.         80h internal error
  8061.         81h hardware malfunction
  8062.         84h undefined function requested
  8063.         8Fh undefined subfunction
  8064.         A4h operating system denied access
  8065. --------------------------------------------------
  8066. INT 67 - EEMS - GET PHYSICAL WINDOW ARRAY
  8067.     AH = 60h
  8068.     ES:DI -> buffer
  8069. Return: AH = status
  8070.     AL = number of entries
  8071.     buffer at ES:DI filled
  8072. --------------------------------------------------
  8073. INT 67 - EEMS - GENERIC ACCELERATOR CARD SUPPORT
  8074.     AH = 61h
  8075.     ???
  8076. Return: ???
  8077. Note: can be used by accelerator card manufacturer to flush RAM cache, ensuring
  8078.       that the cache accurately reflects what the processor would see without
  8079.       the cache.
  8080. --------------------------------------------------
  8081. INT 67 - EEMS - GET ADDRESSES OF ALL PAGE FRAMES IN SYSTEM
  8082.     AH = 68h
  8083.     ES:DI -> buffer
  8084. Return: AH = status
  8085.     AL = number of entries
  8086.     buffer at ES:DI filled
  8087. Note: equivalent to LIM 4.0 function 58h
  8088. --------------------------------------------------
  8089. INT 67 - EEMS - MAP PAGE INTO FRAME
  8090.     AH = 69h
  8091.     AL = frame number
  8092.     BX = page number
  8093.     DX = handle
  8094. Return: AH = status
  8095. Note: similar to EMS function 44h
  8096. --------------------------------------------------
  8097. INT 67 - EEMS - PAGE MAPPING
  8098.     AH = 6Ah
  8099.     AL = subfunction
  8100.         00h save partial page map
  8101.         CH = first page frame
  8102.         CL = number of frames
  8103.         ES:DI -> buffer which is to be filled
  8104.         01h restore partial page map
  8105.         CH = first page frame
  8106.         CL = number of frames
  8107.         DI:SI -> previously saved page map
  8108.         02h save and restore partial page map
  8109.         CH = first page frame
  8110.         CL = number of frames
  8111.         ES:DI = buffer for current page map
  8112.         DI:SI = new page map
  8113.         03h get size of save array
  8114.         CH = first page frame
  8115.         CL = number of frames
  8116.         Return: AL = size of array in bytes
  8117.         04h switch to standard map register setting
  8118.         05h switch to alternate map register setting
  8119.         06h deallocate pages mapped to frames in conventional memory
  8120.         CH = first page frame
  8121.         CL = number of frames
  8122. Return: AH = status
  8123. Note: similar to EMS function 4Eh, except that a subrange of pages can
  8124.       be specified
  8125. --------------------------------------------------
  8126. INT 68 - APPC/PC
  8127.     AH = 01h
  8128.     DS:DX -> control block
  8129.         12 BYTEs reserved
  8130.            WORD  verb (action)
  8131.          6 BYTEs 0
  8132.            DWORD (high byte first) return code
  8133.              0000h    successful
  8134.              0001h    BAD_TP_ID
  8135.              0002h    BAD_CONV_ID
  8136.              0003h    bad logical unit ID
  8137.              0008h    no physical unit attached
  8138.              0110h    bad state
  8139.              01B1h    BAD_PART_LUNAME
  8140.              01B2h    bad mode name
  8141.              0201h    physical unit already active
  8142.              0211h    logical unit already active
  8143.              0212h    BAD_PART_SESS
  8144.              0213h    BAD_RU_SIZES
  8145.              0214h    BAD_MODE_SESS
  8146.              0216h    BAD_PACING_CNT
  8147.              0219h    EXTREME_RUS
  8148.              021Ah    SNASVCMG_1
  8149.              0223h    SSCP_CONNECTED_LU
  8150.              0230h    invalid change
  8151.              0243h    too many TPs
  8152.              0272h    adapter close failure
  8153.              0281h    GET_ALLOC_BAD_TYPE
  8154.              0282h    unsuccessful
  8155.              0283h    DLC failure
  8156.              0284h    unrecognized DLC
  8157.              0286h    duplicate DLC
  8158.              0301h    SSCP_PU_SESSION_NOT_ACTIVE
  8159.              0302h    data exceeds RU size
  8160.              0401h    invalid direction
  8161.              0402h    invalid type
  8162.              0403h    segment overlap
  8163.              0404h    invalid first character
  8164.              0405h    table error
  8165.              0406h    conversion error
  8166.              F0010000h    APPC disabled
  8167.              F0020000h    APPC busy
  8168.              F0030000h    APPC abended
  8169.              F0040000h    incomplete
  8170. if verb = 1B00h (DISPLAY), control block continues
  8171.     WORD  0
  8172.       8 BYTEs (high byte first) logical unit ID
  8173.       8 BYTEs (high byte first) partner logical unit name
  8174.       8 BYTEs (high byte first) mode name
  8175.     BYTE  logical unit session limit
  8176.     BYTE  partner logical unit session limit
  8177.     BYTE  mode maximum negotiable session limit
  8178.     BYTE  current session limit
  8179.     BYTE  minimum negotiated winner limit
  8180.     BYTE  maximum negotiated loser limit
  8181.     BYTE  active session count
  8182.     BYTE  active CONWINNER session count
  8183.     BYTE  active CONLOSER session count
  8184.     BYTE  session termination count
  8185.     BYTE  bit 7: SESSION_TERMINATION_TARGET_DRAIN
  8186.           bit 6: SESSION_TERMINATION_SOURCE_DRAIN
  8187. if verb=2000h (Attach Physical Unit), control block continues
  8188.     WORD  0
  8189.     BYTE  version
  8190.     BYTE  release
  8191.       8 BYTEs (high byte first) net name
  8192.       8 BYTEs (high byte first) physical unit name
  8193.       8 BYTEs 0
  8194.     DWORD pointer to SYSTEM_LOG_EXIT routine, FFFFFFFFh = don't log errors
  8195.     DWORD 0
  8196.     BYTE  0 RETURN_CONTROL: COMPLETE
  8197.           1 RETURN_CONTROL: INCOMPLETE
  8198. if verb=2100h (Attach Logical Unit), control block continues
  8199.     WORD  70  offset to partner logical unit record
  8200.       8 BYTEs (high byte first) logical unit name
  8201.       8 BYTEs (high byte first) logical unit ID
  8202.     BYTE  logical unit local address
  8203.     BYTE  logical unit session limit
  8204.     DWORD pointer to CREATE_TP_EXIT routine,
  8205.           FFFFFFFFh = reject incoming ALLOCATEs
  8206.           00000000h = queue ALLOCATEs
  8207.     DWORD 0
  8208.     DWORD pointer to SYSTEM_LOG_EXIT routine, FFFFFFFFh = don't log errors
  8209.     DWORD 0
  8210.     BYTE  maximum TPs
  8211.     BYTE  queue depth
  8212.     DWORD pointer to LU_LU_PASSWORD_EXIT routine, FFFFFFFFh = no pswd exit
  8213.     DWORD 0
  8214.     WORD  total length of partner records
  8215.     for each partner logical unit:
  8216.     WORD  length of this partner logical unit record
  8217.     WORD  42  offset to mode records
  8218.       8 BYTEs (high byte first) partner logical unit name
  8219.     BYTE  partner logical unit security capabilities
  8220.         bit 7: already verified
  8221.         bit 6: conversation level security
  8222.         bit 5: session level security
  8223.     BYTE  partner logical unit session limit
  8224.     WORD  partner logical unit maximum MC_SEND_LL
  8225.       8 BYTEs (high byte first) partner logical unit DLC name
  8226.     BYTE  partner logical unit adapter number
  8227.      17 BYTEs (counted string) partner logical unit adapter address
  8228.     WORD  total length of mode records
  8229.    for each mode:
  8230.     WORD  16  length of this mode record
  8231.       8 BYTEs (high byte first) mode name
  8232.     WORD  RU_SIZE high bound
  8233.     WORD  RU_SIZE low bound
  8234.     BYTE  mode maximum negotiable session limit
  8235.     BYTE  pacing size for receive
  8236. if verb=2200h (Detach Logical Unit), control block continues:
  8237.       8 BYTEs (high byte first) logical unit ID
  8238.     BYTE  0
  8239. if verb=2700h (Detach Physical Unit), control block continues:
  8240.     BYTE  0  type: hard
  8241.           1  type: soft
  8242. if verb=2B00h (Activate DLC), control block continues:
  8243.       8 BYTEs (high byte first) DLC name
  8244.     BYTE  adapter number
  8245.  
  8246. Routines defined by LU_LU_PASSWORD_EXIT, CREATE_TP_EXIT, and SYSTEM_LOG_EXIT
  8247. pointers are called by pushing the DWORD pointer to the verb on the stack and
  8248. then performing a FAR call.
  8249.  
  8250. ACCESS_LU_LU_PW verb:
  8251.      12 BYTEs reserved
  8252.     WORD  1900h
  8253.       8 BYTEs (high byte first) logical unit ID
  8254.       8 BYTEs (high byte first) logical unit name
  8255.       8 BYTEs (high byte first) partner logical unit name
  8256.      17 BYTEs (counted string) partner fully qualified logical unit name
  8257.     BYTE  password available (0=no, 1=yes)
  8258.       8 BYTEs password
  8259. CREATE_TP verb:
  8260.      12 BYTEs reserved
  8261.     WORD  2300h
  8262.       6 BYTEs 0
  8263.     DWORD (high byte first) sense code
  8264.           00000000h    Ok
  8265.           080F6051h    SECURITY_NOT_VALID
  8266.           084B6031h    TP_NOT_AVAIL_RETRY
  8267.           084C0000h    TP_NOT_AVAIL_NO_RETRY
  8268.           10086021h    TP_NAME_NOT_RECOGNIZED
  8269.           10086034h    CONVERSATION_TYPE_MISMATCH
  8270.           10086041h    SYNC_LEVEL_NOT_SUPPORTED
  8271.       8 BYTEs (high byte first) TP ID
  8272.       8 BYTEs (high byte first) logical unit ID
  8273.     DWORD (high byte first) conversation ID
  8274.     BYTE  0 basic conversation, 1 mapped conversation
  8275.     BYTE  0 no sync level, 1 confirm
  8276.     BYTE  reserved
  8277.      65 BYTEs (counted string) transaction program name
  8278.       6 BYTEs 0
  8279.     WORD  length of ERROR_LOG_DATA to return
  8280.     DWORD pointer to ERROR_LOG_DATA buffer
  8281.       8 BYTEs (high byte first) partner logical unit name
  8282.      18 BYTEs (counted string) partner fully qualified logical unit name
  8283.       8 BYTEs (high byte first) mode name
  8284.      12 BYTEs 0
  8285.      11 BYTEs (counted string) password
  8286.      11 BYTEs (counted string) user ID
  8287.     BYTE  0 verification should be performed
  8288.           1 already verified
  8289. SYSLOG verb:
  8290.      12 BYTEs reserved
  8291.     WORD  2600h
  8292.      10 BYTEs 0
  8293.     WORD  (high byte first) type
  8294.     DWORD (high byte first) subtype
  8295.     DWORD pointer to ADDITIONAL_INFO
  8296.     DWORD (high byte first) conversation ID
  8297.       8 BYTEs (high byte first) TP ID
  8298.       8 BYTEs (high byte first) physical unit or logical unit name
  8299.     WORD  length of data
  8300.     DWORD pointer to data
  8301.     BYTE  0
  8302. --------------------------------------------------
  8303. INT 68 - APPC/PC
  8304.     AH = 02h
  8305.     DS:DX -> control block
  8306.         12 BYTEs reserved
  8307.            WORD  verb (action)
  8308.            BYTE  1 if MC_ (mapped conversation) form of verb
  8309.              0 if basic verb
  8310.          5 BYTEs 0
  8311.            WORD  (high byte first) primary return code
  8312.             0000h  successful
  8313.             0001h  parameter check
  8314.             0002h  state check
  8315.             0003h  allocation error
  8316.             0005h  deallocate abended
  8317.             0006h  deallocate abended program
  8318.             0007h  deallocate abended SVC
  8319.             0008h  deallocate abended timer
  8320.             0009h  deallocate normal return
  8321.             000Ah  data posting blocked
  8322.             000Bh  posting not active
  8323.             000Ch  PROG_ERROR_NO_TRUNC
  8324.             000Dh  PROG_ERROR_TRUNC
  8325.             000Eh  PROG_ERROR_PURGING
  8326.             000Fh  CONV_FAILURE_RETRY
  8327.             0010h  CONV_FAILURE_NO_RETRY
  8328.             0011h  SVC_ERROR_NO_TRUNC
  8329.             0012h  SVC_ERROR_TRUNC
  8330.             0013h  SVC_ERROR_PURGING
  8331.             0014h  unsuccessful
  8332.             0018h  CNOS partner logical unit reject
  8333.             0019h  conversation type mixed
  8334.             F001h  APPC disabled
  8335.             F002h  APPC busy
  8336.             F003h  APPC abended
  8337.             F004h  incomplete
  8338.            DWORD (high byte first) error code
  8339.             0001h bad TP ID
  8340.             0002h bad conversation ID
  8341.             0004h allocation error, no retry
  8342.             0005h allocation error, retry
  8343.             0006h data area crosses segment boundary
  8344.             0010h bad TPN length
  8345.             0011h bad CONV length
  8346.             0012h bad SYNC level
  8347.             0013h bad security selection
  8348.             0014h bad return control
  8349.             0015h SEC_TOKENS too big
  8350.             0016h PIP_LEN incorrect
  8351.             0017h no use of SNASVCMG
  8352.             0018h unknown partner mode
  8353.             0031h confirm: SYNC_NONE
  8354.             0032h confirm: bad state
  8355.             0033h confirm: NOT_LL_BDY
  8356.             0041h confirmed: bad state
  8357.             0051h deallocate: bad type
  8358.             0052h deallocate: flush bad state
  8359.             0053h deallocate: confirm bad state
  8360.             0055h deallocate: NOT_LL_BDY
  8361.             0057h deallocate: log LL_WRONG
  8362.             0061h flush: not send state
  8363.             0091h post on receipt: invalid length
  8364.             0092h post on receipt: not in receive state
  8365.             0093h post on receipt: bad fill
  8366.             00A1h prepare to receive:invalid type
  8367.             00A2h prepare to receive: unfinished LL
  8368.             00A3h prepare to receive: not in send state
  8369.             00B1h receive and wait: bad state
  8370.             00B2h receive and wait: NOT_LL_BDY
  8371.             00B5h receive and wait: bad fill
  8372.             00C1h receive immediate: not in receive state
  8373.             00C4h receive immediate: bad fill
  8374.             00E1h request to send: not in receive state
  8375.             00F1h send data: bad LL
  8376.             00F2h send data: not in send state
  8377.             0102h send error: log LL wrong
  8378.             0103h send error: bad type
  8379.             0121h test: invalid type
  8380.             0122h test: not in receive state
  8381.          8 BYTEs (high byte first) TP_ID
  8382.            DWORD (high byte first) conversation ID
  8383. if verb=0100h (Allocate or MC_Allocate), control block continues:
  8384.     BYTE  (MC_Allocate only) 0 basic conversation
  8385.                  1 mapped conversation
  8386.     BYTE  0 SYNC_LEVEL = none
  8387.           1 SYNC_LEVEL = confirm
  8388.     WORD  0
  8389.     BYTE  0 RETURN_CONTROL: when session allocated
  8390.           1 RETURN_CONTROL: immediate
  8391.           2 RETURN_CONTROL: when session free
  8392.       8 BYTEs 0
  8393.       8 BYTEs (high byte first) partner logical unit name
  8394.       8 BYTEs (high byte first) mode name
  8395.      65 BYTEs (counted string) TP name
  8396.     BYTE  0 security: none
  8397.           1 security: same
  8398.           2 security: pgm
  8399.      11 BYTEs 0
  8400.      11 BYTEs (counted string) password
  8401.      11 BYTEs (counted string) user ID
  8402.     WORD  PIP_DATA length
  8403.     DWORD pointer to PIP_DATA
  8404. if verb=0300h (Confirm or MC_Confirm), then control block continues:
  8405.     BYTE  request to send received (0=no, 1=yes)
  8406. if verb=0400h (Confirmed or MC_Confirmed), no additional fields
  8407. if verb=0500h (Deallocate or MC_Deallocate), then control block continues:
  8408.     BYTE  0
  8409.     BYTE  type 0 SYNC_LEVEL
  8410.            1 FLUSH
  8411.            2 ABEND_PROC
  8412.            3 ABEND_SVC
  8413.            4 ABEND_TIMER
  8414.            5 ABEND
  8415.     WORD  (MC_Deallocate only) length of error log data
  8416.     DWORD (MC_Deallocate only) pointer to error log data
  8417. if verb=0600h (Flush or MC_Flush), no additional fields
  8418. if verb=0700h (Get_Attributes or MC_Get_Attributes), control block continues:
  8419.       8 BYTEs (high byte first) logical unit ID
  8420.     BYTE  0
  8421.     BYTE  SYNC_LEVEL (0=none, 1=confirm)
  8422.       8 BYTEs (high byte first) mode name
  8423.       8 BYTEs (high byte first) own net name
  8424.       8 BYTEs (high byte first) own logical unit name
  8425.       8 BYTEs (high byte first) partner logical unit name
  8426.      18 BYTEs (counted string) partner's fully qualified logical unit name
  8427.     BYTE  0
  8428.      11 BYTEs (counted string) user ID
  8429. if verb=0800h (Get_Type), then control block continues:
  8430.     BYTE  type (0=basic conversation, 1=mapped conversation)
  8431. if verb=0900h (Post_on_Receipt), then control block continues:
  8432.     WORD  maximum length
  8433.     BYTE  fill (0=buffer, 1=LL)
  8434. if verb=0A00h (Prepare_to_Receive or MC_Prepare_to_Receive):
  8435.     BYTE  type (0=SYNC_LEVEL, 1=FLUSH)
  8436.     BYTE  locks (0=short, 1=long)
  8437. if verb=0B00h (Receive_and_Wait or MC_Receive_and_Wait), control block cont:
  8438.     BYTE  what received
  8439.         0 data
  8440.         1 data complete
  8441.         2 data incomplete
  8442.         3 confirm
  8443.         4 confirm send
  8444.         5 confirm deallocate
  8445.         6 send
  8446.     BYTE  (MC_Receive_and_Wait only) fill (0=buffer, 1=LL)
  8447.     BYTE  Request_to_Send_Received (0=no, 1=yes)
  8448.     WORD  maximum length
  8449.     WORD  data length
  8450.     DWORD pointer to data
  8451. if verb=0C00h (Receive_Immediate or MC_Receive_Immediate), control block:
  8452.     BYTE  what received
  8453.         0 data
  8454.         1 data complete
  8455.         2 data incomplete
  8456.         3 confirm
  8457.         4 confirm send
  8458.         5 confirm deallocate
  8459.         6 send
  8460.     BYTE  (MC_Receive_Immediate only) fill (0=buffer, 1=LL)
  8461.     BYTE  Request_to_Send_Received (0=no, 1=yes)
  8462.     WORD  maximum length
  8463.     WORD  data length
  8464.     DWORD pointer to data
  8465. if verb=0E00h (Request_to_Send or MC_Request_to_Send), no additional fields
  8466. if verb=0F00h (Send_Data or MC_Send_Data), then control block continues:
  8467.     BYTE  request to send received (0=no, 1=yes)
  8468.     BYTE  0
  8469.     WORD  data length
  8470.     DWORD pointer to data
  8471. if verb=1000h (Send_Error or MC_Send_Error)
  8472.     BYTE  request to send received (0=no, 1=yes)
  8473.     BYTE  type (0=program, 1=SVC)
  8474.     DWORD 0
  8475.     WORD  (MC_Send_Error only) LOG_DATA length
  8476.     DWORD (MC_Send_Error only) pointer to LOG_DATA
  8477. if verb=1200h (Test or MC_Test), then control block continues:
  8478.     BYTE  (MC_Test only) test (0=posted, 1=request_to_send received)
  8479.     Note: error code has different interpretations for:
  8480.     0 posted data
  8481.     1 posted not data (primary return code = 0)
  8482.     1 bad TP_ID (primary return code = 1)
  8483. if verb=1300h (Wait), then control block continues:
  8484.     BYTE  number of conversations to wait on
  8485.     Note: error codes have interpretations as for 1200h (Test) above
  8486. --------------------------------------------------
  8487. INT 68 - APPC/PC
  8488.     AH = 03h
  8489.     DS:DX -> control block
  8490.         12 BYTEs reserved
  8491.            WORD  verb (action)
  8492.          6 BYTEs 0
  8493.            DWORD (high byte first) return code (see AH=01h)
  8494.            WORD  0
  8495.          8 BYTEs (high byte first) logical unit ID
  8496. if verb=2400h (TP Started), control block continues:
  8497.       8 BYTEs (high byte first) TP ID
  8498. if verb=2800h (Get ALLOCATE), control block continues:
  8499.     BYTE  type
  8500.         0 dequeue
  8501.         1 test
  8502.     DWORD pointer to CREATE_TP record
  8503. if verb=2A00h (Change Logical Unit). control block continues:
  8504.     DWORD pointer to CREATE_TP_EXIT routine
  8505.         FFFFFFFFh reject incoming ALLOCATEs
  8506.         00000000h queue ALLOCATEs
  8507.     DWORD 0
  8508.     DWORD pointer to SYSTEM_LOG_EXIT routine, FFFFFFFFh = don't log errors
  8509.     DWORD 0
  8510.     BYTE  maximum TPs
  8511.     BYTE  0 stop QUEUE_ALLOCATEs
  8512.           1 resume QUEUE_ALLOCATEs
  8513.     DWORD pointer to LU_LU_PASSWORD_EXIT routine, FFFFFFFFh = no exit
  8514.     DWORD 0
  8515. --------------------------------------------------
  8516. INT 68 - APPC/PC
  8517.     AH = 04h
  8518.     DS:DX -> control block
  8519.         12 BYTEs reserved
  8520.            WORD  verb (action)
  8521.             2500h TP_ENDED
  8522.             2900h TP_VALID
  8523.          6 BYTEs 0
  8524.            DWORD (high byte first) return code (see AH=01h)
  8525.            WORD  0
  8526.          8 BYTEs (high byte first) TP_ID
  8527.            DWORD -> CREATE_TP record (only if verb = 2900h)
  8528. --------------------------------------------------
  8529. INT 68 - APPC/PC - TRANSFER MSG DATA
  8530.     AH = 05h
  8531.     DS:DX -> control block
  8532.         12 BYTEs reserved
  8533.            WORD  1C00h
  8534.            BYTE  0 user defined
  8535.              1 NMVT
  8536.              2 alert subvectors
  8537.              3 PDSTATS subvectors
  8538.          5 BYTEs 0
  8539.            DWORD (high byte first) return code (see AH=01h)
  8540.         12 BYTEs 0
  8541.            BYTE  if bit 0 clear, add correlation subvector
  8542.              if bit 1 clear, add product set ID subvector
  8543.              if bit 2 clear, do SYSLOG
  8544.              if bit 3 clear, send SSCP_PU_SESSION
  8545.            BYTE  0
  8546.            WORD  length of data
  8547.          N BYTEs data
  8548. --------------------------------------------------
  8549. INT 68 - APPC/PC - CHANGE NUMBER OF SESSIONS
  8550.     AH = 06h
  8551.     DS:DX -> control block
  8552.         12 BYTEs reserved
  8553.            WORD  1500h
  8554.          6 BYTEs 0
  8555.            WORD  (high byte first) primary return code (see AH=02h)
  8556.            DWORD (high byte first) secondary return code (see AH=01h)
  8557.             0000h accepted
  8558.             0001h negotiated
  8559.             0003h bad logical unit ID
  8560.             0004h allocation failure, no retry
  8561.             0005h allocation failure, retry
  8562.             0151h can't raise limits
  8563.             0153h all modes must reset
  8564.             0154h bad SNASVCMG limits
  8565.             0155h minimum greater than total
  8566.             0156h mode closed (prim return code = 1)
  8567.                   CNOS mode closed (prim return code = 18h)
  8568.             0157h bad mode name (prim return code = 1)
  8569.                   CNOS bad mode name (prim return code = 18h)
  8570.             0159h reset SNA drains
  8571.             015Ah single not SRC response
  8572.             015Bh bad partner logical unit
  8573.             015Ch exceeds maximum allowed
  8574.             015Dh change SRC drains
  8575.             015Eh logical unit detached
  8576.             015Fh CNOS command race reject
  8577.          8 BYTEs (high byte first) logical unit ID
  8578.          8 BYTEs blanks
  8579.          8 BYTEs (high byte first) partner logical unit name
  8580.          8 BYTEs (high byte first) mode name
  8581.            BYTE  bit 7: use MODE_NAME_SELECT_ALL rather than MODE_NAME
  8582.              bit 6: set negotiable values
  8583.            BYTE  partner logical unit mode session limit
  8584.            BYTE  minimum CONWINNERS_SOURCE
  8585.            BYTE  maximum CONWINNERS_TARGET
  8586.            BYTE  automatic activation
  8587.            BYTE  0
  8588.            BYTE  bit 7: drain targer
  8589.              bit 6: drain source
  8590.              bit 5: target responsible, not source
  8591. --------------------------------------------------
  8592. INT 68 - APPC/PC - PASSTHROUGH
  8593.     AH = 07h
  8594.     DS:DX -> control block (format depends on application subsystem)
  8595. --------------------------------------------------
  8596. INT 68 - APPC/PC - ENABLE/DISABLE APPC
  8597.     AH = FAh
  8598.     AL bit 0 = 0 enable
  8599.            1 disable
  8600. --------------------------------------------------
  8601. INT 68 - APPC/PC - CONVERT
  8602.     AH = FBh
  8603.     DS:DX -> control block
  8604.         12 BYTEs reserved
  8605.            WORD  1A00h
  8606.          6 BYTEs 0
  8607.            DWORD (high byte first) return code
  8608.            BYTE  conversion
  8609.                0 ASCII to EBCDIC
  8610.                1 EBCDIC to ASCII
  8611.            BYTE  character set
  8612.                0 AE
  8613.                1 A
  8614.                2 G
  8615.            WORD  length of string to convert
  8616.            DWORD pointer to source
  8617.            DWORD pointer to target
  8618. --------------------------------------------------
  8619. INT 68 - APPC/PC - ENABLE/DISABLE MESSAGE TRACING
  8620.     AH = FCh
  8621.     AL = 00h disable tracing
  8622.        = 01h enable tracing
  8623.         DX = number of bytes to keep (0=all)
  8624. --------------------------------------------------
  8625. INT 68 - APPC/PC - ENABLE/DISABLE API VERB TRACING
  8626.     AH = FDh
  8627.     AL = 00h disable tracing
  8628.          01h enable tracing
  8629. --------------------------------------------------
  8630. INT 68 - APPC/PC - TRACE DESTINATION
  8631.     AH = FEh
  8632.     AL = trace destinations
  8633.         bit 0  storage (DS:DX -> trace stats record)
  8634.         bit 1  display
  8635.         bit 2  file (trace written to file OUTPUT.PC)
  8636.         bit 3  printer
  8637. Trace Statistics Record
  8638.     DWORD  pointer to storage trace buffer
  8639.     WORD   max number of 80-byte records in trace
  8640.     WORD   (high-order byte first!) current record number (must init to 0)
  8641.     DWORD  (high-order byte first!) number of records written (init to 0)
  8642.     DWORD  reserved
  8643. Note: do not move record while trace is active
  8644. --------------------------------------------------
  8645. INT 68 - APPC/PC - SET PASSTHROUGH
  8646.     AH = FFh
  8647.     DS:DX -> passthrough exit routine
  8648. --------------------------------------------------
  8649. INT 69 - unused
  8650. --------------------------------------------------
  8651. INT 6A - unused
  8652. --------------------------------------------------
  8653. INT 6B - unused
  8654. --------------------------------------------------
  8655. INT 6C - system resume vector (CONVERTIBLE)
  8656. --------------------------------------------------
  8657. INT 6C - DOS 3.2 Realtime Clock update
  8658. --------------------------------------------------
  8659. INT 6D - Paradise VGA - internal
  8660. --------------------------------------------------
  8661. INT 6E - unused
  8662. --------------------------------------------------
  8663. INT 6F - Novell NetWare - PCOX API (3270 PC terminal interface)
  8664. --------------------------------------------------
  8665. INT 6F - 10-NET - LOGIN
  8666.     AH = 00h
  8667.     DS:DX -> login record
  8668.         8 BYTEs user name
  8669.         8 BYTEs password
  8670.            12 BYTEs name of SuperStation
  8671. Return: CL = security level
  8672.     AX = status
  8673.         0000h successful
  8674.         01FFh time out on response
  8675.         02FFh network (hardware) error
  8676.         03FFh invalid password
  8677.         04FFh local rexource not available
  8678.         05FFh server resource not available
  8679.         06FFh already logged in under different name
  8680.         07FFh login security failure (node)
  8681.         08FFh not logged in
  8682.         09FFh position calc error
  8683.         0AFFh receive subfunction not = send subfunction (i.e. read, write)
  8684.         0BFFh request function not in range
  8685.         0CFFh no more server file handle entries left
  8686.         0DFFh no more shared file table entries left
  8687.         0EFFh no more user file handle entries left
  8688.         0FFFh chat permit not on
  8689.         10FFh not a server on request
  8690.         11FFh no transporter board error
  8691.         12FFh time out on send
  8692.         13FFh item not found (spool item not on queue)
  8693.         14FFh dos access incompatible
  8694.         15FFh record already locked
  8695.         16FFh invalid parameter
  8696.         17FFh record lock time out error
  8697.         18FFh currently spooling to named device
  8698.         19FFh dropped receive message (throttle)
  8699.         1AFFh open sharing violation
  8700.         1BFFh no more tuf entries left
  8701.         1CFFh not file owner on open
  8702.         1DFFh read security not passed
  8703.         1EFFh write security not passed
  8704.         1FFFh group security not passed
  8705.         20FFh security file failure
  8706.         21FFh activity file failure
  8707.         22FFh spool cntrl file failure
  8708.         23FFh device not mounted (spooling)
  8709.         24FFh spool file has not been terminated
  8710.         25FFh device not mounted or is not being shared
  8711.         26FFh duplicate node id
  8712.         27FFh file not found error
  8713.         28FFh no more files
  8714.         29FFh unknown internal system error
  8715.         2AFFh print queue is full or corrupted
  8716.         2BFFh invalid function
  8717.         2CFFh invalid handle
  8718.         2DFFh too many files opened
  8719.         2EFFh path not found
  8720.         2FFFh named file is active
  8721. /* I've gotten one submission which says FFxxh, and another with xxFFh */
  8722. /* I don't know which way around these should be, does somebody else know? */
  8723.         FF01h timeout
  8724.         FF02h network error
  8725.         FF03h invalid password
  8726.         FF04h no local buffer
  8727.         FF05h superstation not available
  8728.         FF06h node already logged in
  8729.         FF07h login not valid from this node
  8730.         FF08h node ID already in use
  8731.         FF16h invalid parameter (bad length, invalid node ID, etc)
  8732.         FF17h record locked by another user
  8733.         FF18h sent message has been dropped
  8734. --------------------------------------------------
  8735. INT 6F - 10-NET - LOGOFF
  8736.     AH = 01h
  8737.     DS:DX -> superstation ID or nulls (12 bytes)
  8738. Return: CX = number of files closed
  8739.     AX = status (see function 00h)
  8740.         FF08h superstation ID not already logged in
  8741. --------------------------------------------------
  8742. INT 6F - 10-NET - STATUS OF NODE
  8743.     AH = 02h
  8744.     DS:DX -> 512-byte record
  8745.         8 BYTEs user name (0 if none)
  8746.           BYTE    station type
  8747.             0  workstation
  8748.             1  superstation
  8749.             2  gateway station
  8750.             3  gateway active
  8751.             4  logged into multiple superstations
  8752.             5  reserved
  8753.            24 BYTEs list of superstations logged into more than one
  8754.             superstation
  8755.            12 BYTEs node ID
  8756.           WORD    message count for this station (send for user node,
  8757.             receive for superstations)
  8758.     for superstations only:
  8759.           WORD    drives allocated (bit 0=A:, bit 1=B:,...)
  8760.           BYTE    user service flag
  8761.             bit 7: gate
  8762.                 6: print permit on
  8763.                 4: SUBMIT is on
  8764.                 3: mail waiting for node
  8765.                 2: calendar waiting for you
  8766.                 1: news waiting for you
  8767.                 0: mail waiting for you
  8768.           BYTE    printers allocated (bit 0=LPT1,...)
  8769.           BYTE    number of unprinted spool files
  8770.           BYTE    number of opened files
  8771.           BYTE    number of logged on nodes
  8772.           BYTE    primary drive (1=A:)
  8773.           BYTE    reserved
  8774.         N BYTEs list of logged on node IDs (each 12 bytes, max 37 IDs)
  8775.                 (continues at offset 1F4h)
  8776.         3 BYTEs time: sec/min/hrs
  8777.         3 BYTEs date: day/mon/year-1980
  8778. Return: CF set on error
  8779.         AX = error code (see function 00h)
  8780. --------------------------------------------------
  8781. INT 6F - 10-NET - GET ADDRESS OF CONFIGURATION TABLE
  8782.     AH = 03h
  8783.     DS:DI -> node ID (optional)
  8784. Return: ES:BX -> record (actually starts at [BX-41])
  8785.         WORD  local device table address
  8786.         WORD  extended network error mapping table address
  8787.         WORD  shared device table address
  8788.         WORD  mounted device table address
  8789.         BYTE  receive buffer counter
  8790.         BYTE  collect buffer counter
  8791.         WORD  TUF address
  8792.         BYTE  enable flag
  8793.         BYTE  FCB keep flag
  8794.         WORD  reserved
  8795. ---up to here, 10-Net v3.3---
  8796.         WORD  count of dropped Send6F
  8797.         WORD  buffer start address
  8798.         WORD  comm driver base address
  8799.         WORD  send/receive retry count
  8800.         BYTE  number of 550ms loops before timeout
  8801.         WORD  UFH address
  8802.         WORD  CDIR address
  8803.         WORD  LTAB address
  8804.         WORD  SFH address
  8805.         WORD  FTAB address
  8806.         WORD  RLTAB address
  8807.         WORD  SMI address
  8808.         WORD  NTAB address
  8809.        ES:BX -> WORD  address of first CT_DRV
  8810.         BYTE  number of DRV entries
  8811.           8 BYTEs login name
  8812.          12 BYTEs node ID (blank-padded)
  8813.           6 BYTEs node address
  8814.         BYTE  flag
  8815.         BYTE  CT_CFLG (chat permit)
  8816.             bit 1: sound bell
  8817.             bit 0: CHAT permit
  8818.         BYTE  CT_PSFLG
  8819.             bit 5: PRINT permit
  8820.             bit 4: KB initiated
  8821.             bit 3: CHAT called FOXPTRM
  8822.             bit 2: SUBMIT active
  8823.             bit 1: SUBMIT received
  8824.             bit 0: SUBMIT permit
  8825.         BYTE  in 10Net flag
  8826.         WORD  receive message count
  8827.         WORD  send message count
  8828.         WORD  retry count
  8829.         WORD  failed count
  8830.         WORD  driver errors
  8831.         WORD  dropped responses/CHATs
  8832.           9 BYTEs LIST ID/NTAB address (3 entries--LPT1-3)
  8833.           6 BYTEs AUX ID/NTAB address (2 entries--COM1-2)
  8834.         BYTE  active CB channel
  8835.         BYTE  received 6F messages on queue
  8836.           9 BYTEs activity counters for channels 1-9
  8837. ---beyond here, 10-Net v3.3---
  8838.         BYTE  bit 0 = RS232 gate
  8839.                           1 = Send6F gate (user set)
  8840.             DWORD pointer into gate (user set)
  8841.         DWORD pointer into 10Net send
  8842.               N WORDs addresses of timer blocks
  8843. --------------------------------------------------
  8844. INT 6F - 10-NET - SEND
  8845.     AH = 04h
  8846.     DS:BX -> record
  8847.         12 BYTEs receiving node's ID
  8848.             if first byte has high-order bit set, message is
  8849.                directed to the CT_RGATE vector at the receiver
  8850.             if second byte is 00h, first byte is taken as a CB
  8851.                channel number and delivered to all nodes on same
  8852.                channel
  8853.            WORD  length of data at DX
  8854.     DS:DX -> data (max 1024 bytes)
  8855. Return: CF set on error
  8856.         AX = error code (see function 00h)
  8857. --------------------------------------------------
  8858. INT 6F - 10-NET - RECEIVE
  8859.     AH = 05h
  8860.     CX = number of seconds before timeout
  8861.     DS:DX -> receive buffer
  8862.         12 BYTEs sending node's ID
  8863.            WORD  length of message
  8864.          N BYTEs message (maximum 1024 bytes)
  8865. Return: CF set on error
  8866.         AX = error code (see function 00h)
  8867.     CF clear if successful
  8868.         AH = FEh if dequeued message is a CB message
  8869. --------------------------------------------------
  8870. INT 6F - 10-NET - LOCK HANDLE
  8871.     AH = 07h
  8872.     BX = file handle
  8873.     CX:DX = starting offset in file
  8874.     SI = record length
  8875. Return: CF set on error
  8876.         AX = error code (see also function 00h)
  8877.         0002h file not found
  8878. --------------------------------------------------
  8879. INT 6F - 10-NET - UNLOCK HANDLE
  8880.     AH = 08h
  8881.     BX = file handle
  8882.     AL = mode
  8883.         0 unlock all
  8884.         1 unlock record at CX:DX
  8885. Return: CF set on error
  8886.         AX = error code (see also function 00h)
  8887.         2 file not found
  8888. --------------------------------------------------
  8889. INT 6F - 10-NET - SUBMIT
  8890.     AH = 09h
  8891.     DS:BX -> record
  8892.         12 BYTEs destination node ID (must be logged in)
  8893.            WORD  length+2 of following 'command line' text
  8894.          N BYTEs command line text (<=100 bytes), system adds CR
  8895. --------------------------------------------------
  8896. INT 6F - 10-NET - CHAT
  8897.     AH = 0Ah
  8898.     DS:BX -> control parameters
  8899.          8 BYTEs sender ID, if nulls defaults to node's userID
  8900.          8 BYTEs destination user ID, 'EVERYONE' may be used
  8901.         12 BYTEs destination node ID
  8902.     DS:DX -> chat message
  8903.            WORD length+2 of following text
  8904.          N BYTEs text, max 101 bytes
  8905. --------------------------------------------------
  8906. INT 6F - 10-NET - LOCK SEMAPHORE, RETURN IMMEDIATELY
  8907.     AH = 0Bh
  8908.     AL = drive number or 0
  8909.     ES:SI = Ethernet address or 0
  8910.     DS:BX -> 31-byte ASCIZ semaphore name
  8911. Return: AL = status
  8912.         0 successful
  8913.         1 semaphore currently locked
  8914.         2 server not responding
  8915.         3 invalid semaphore name
  8916.         4 semaphore list is full
  8917.         5 invalid drive ID
  8918.         6 invalid Ethernet address
  8919.         7 not logged in
  8920.         8 write to network failed
  8921.         9 semaphore already logged in this CPU
  8922. Note: same as INT 60/AH=12h
  8923. --------------------------------------------------
  8924. INT 6F - 10-NET - UNLOCK SEMAPHORE
  8925.     AH = 0Ch
  8926.     AL = drive number or 0
  8927.     ES:SI = Ethernet address or 0
  8928.     DS:BX -> 31-byte ASCIZ semaphore name
  8929. Return: AL = status (see AH=0Bh)
  8930.         1 semaphore not locked
  8931. Note: same as INT 60/AH=13h
  8932. --------------------------------------------------
  8933. INT 6F - 10-NET - WHO
  8934.     AH = 0Dh
  8935.     AL = type code
  8936.         01h return superstations only
  8937.         02h return non-superstations only
  8938.         otherwise return all
  8939.     CX = length of data
  8940.     DS:DX -> array of records to be filled
  8941.         12 BYTEs node ID
  8942.            BYTE  flags
  8943.                         bit 1 = workstation
  8944.                             2 = superstation
  8945.                 3 = xgate
  8946.                 4 = active gate
  8947.         (if AL=01h, record continues)
  8948.            BYTE  version number
  8949.                    WORD  level number of 10Net software in responding node
  8950.         (if AL=02h, record continues)
  8951.          8 BYTEs user ID
  8952.            BYTE  version number
  8953.            WORD  level number
  8954. Return: CL = number of records returned (responding stations)
  8955. --------------------------------------------------
  8956. INT 6F - 10-NET - SPOOL/PRINT
  8957.     AH = 0Eh
  8958.     DS:DX -> record
  8959.         WORD  operation code
  8960.               0 initiate spool
  8961.               1 abort print
  8962.               2 close spool
  8963.               3 delete spool
  8964.               4 print
  8965.               5 get report info
  8966.               6 set chat template
  8967.               7 queue
  8968.               8 return queue
  8969.               9 queue non-spooled file for printing
  8970.          11 BYTEs file name in FCB format
  8971.     (if operation code = 00h or 06h, record continues)
  8972.         BYTE  notification
  8973.             bit 7: queue to top
  8974.             bit 6: do ID page
  8975.             bit 5: no form feed
  8976.             bit 4: reserved
  8977.             bit 3: explicity queuing only
  8978.             bit 2: notify at print completion
  8979.             bit 1: notify server operator/reply
  8980.             bit 0: notify at print start
  8981.         BYTE  days to keep (FFh=forever)
  8982.         BYTE  bits 0,1: device (1=LPT1)
  8983.               bits 4-7: remote drive to store spool file (1=A,...)
  8984.         WORD  length of following data area
  8985.           N BYTEs up to 64 bytes of description
  8986.     (if operation code = 03h, record continues)
  8987.           8 BYTEs user ID to associate with filename
  8988.     (if operation code = 04h, record continues)
  8989.         WORD  block number
  8990.           8 BYTEs user ID to associate with filename
  8991.     (if operation code = 05h, record continues)
  8992.         BYTE  RRN to start retrieve
  8993.                 BYTE  bits 0,1: local print device (LPTx)
  8994.               bit 3: if set, return entries for all users
  8995.         WORD  length of following area
  8996.           N BYTEs up to 1500 bytes to receive $SCNTL records returned
  8997.     (if operation code = 07h, record continues)
  8998.             BYTE  queue number
  8999.         BYTE  bits 0,1: local print device (LPTx)
  9000.         WORD  number of bytes of test print to be done
  9001.         BYTE  code: 01h prnt device
  9002.                 02h test print count
  9003.                 03h prn
  9004.     (if operation code = 08h, record continues)
  9005.         BYTE  queue location or $SCNTL location to start access
  9006.             returns next item for access:
  9007.                 00h-7Fh queued items
  9008.                 80h-FEh non-queued, non-printed items
  9009.                 FFh    no more items
  9010.         WORD  unused
  9011.         WORD  length of following area
  9012.           N BYTEs up to 64 bytes to receive $SCNTL records
  9013.     (if operation code = 09h, record continues)
  9014.           3 BYTEs unused
  9015.           N BYTEs path to non-spooled file to be queued for printing
  9016. Return: CF set on error
  9017.         AX = error code (see also function 00h)
  9018.         FF17h device not mounted
  9019.         FF18h already spooling to named device
  9020.  
  9021. $SCNTL record:
  9022.       8 BYTEs user ID
  9023.      11 BYTEs filename in FCB format
  9024.       6 BYTEs node ID
  9025.       3 BYTEs creation date
  9026.     BYTE  flags
  9027.           bit 7: queue to top
  9028.               6: do ID page
  9029.           5: no form feed at end
  9030.           4: reserved
  9031.           3: explicit queueing only
  9032.           2: notify at completion
  9033.           1: notify server operator/reply
  9034.           0: notify at start
  9035.     BYTE  retention time in days
  9036.     BYTE  printing device (LPTx)
  9037.       3 BYTEs date last printed (0 = never)
  9038.     BYTE  device containing spoolfile
  9039.     WORD  bytes to print for test print
  9040.     WORD  block number to start print
  9041.     BYTE  reserved
  9042. --------------------------------------------------
  9043. INT 6F - 10-NET - ATTACH/DETACH PRINTER
  9044.     AH = 10h
  9045.     AL = subfunction
  9046.         00h initiate spooling if LPT1 is mounted
  9047.         01h terminate spooling if LPT1 is mounted
  9048. --------------------------------------------------
  9049. INT 6F - 10-NET - LOCK FCB
  9050.     AH = 11h
  9051.     AL = mode
  9052.         1 sequential
  9053.         2 random
  9054.         3 random block
  9055.         CX = number of records
  9056.     DS:DX -> FCB
  9057. Return: CF set on error
  9058.         AX = error code (see also function 00h)
  9059.                 2 file not found
  9060. --------------------------------------------------
  9061. INT 6F - 10-NET - UNLOCK FCB
  9062.     AH = 12h
  9063.     AL = mode
  9064.         0 sequential
  9065.         1 random
  9066.         2 random block
  9067.         CX = number of records
  9068.     DS:DX -> FCB
  9069. Return: CF set on error
  9070.         AX = error code (see also function 00h)
  9071.                 2 file not found
  9072. --------------------------------------------------
  9073. INT 6F - 10-NET v3.3 - GET REMOTE CONFIGURATION TABLE ADDRESS
  9074.     AH = 13h
  9075.     DS:DX -> node ID, 12 bytes blank-padded
  9076. Return: CF set on error
  9077.         AX = error code (see function 00h)
  9078.     CF clear if successful
  9079.         ES:BX = configuration table address on given machine
  9080. --------------------------------------------------
  9081. INT 6F - 10-NET v3.3 - GET REMOTE MEMORY
  9082.     AH = 14h
  9083.     BX:SI = address of remote memory
  9084.     CX = length (<=1024 bytes)
  9085.     DS:DX -> node ID, 12 bytes blank-padded
  9086.     DS:DI -> area to receive remote memory image
  9087. Return: CF set on error
  9088.         AX = error code (see function 00h)
  9089.     CF clear if successful
  9090.         CX = amount of memory copied to DS:SI
  9091. --------------------------------------------------
  9092. INT 6F - 10-NET v3.3 - GET SHARED DEVICE ENTRY
  9093.     AX = 1501h
  9094.     BX = zero-based index
  9095.     DS:SI -> node ID, 12 bytes blank-padded
  9096.     ES:DI -> 85-byte buffer
  9097. Return: CF set on error
  9098.         AX = error code (see function 00h)
  9099.     CF clear if successful
  9100.         ES:DI buffer contains shared device table entry of BXth device:
  9101.         8 BYTEs device
  9102.         8 BYTEs alias
  9103.            64 BYTEs path
  9104.         8 BYTEs password
  9105.           BYTE  access
  9106.         4 BYTEs mask
  9107. --------------------------------------------------
  9108. INT 6F - 10-NET v3.3 - SET SHARED DEVICE ENTRY
  9109.     AX = 1502h
  9110.     DS:SI -> node ID, 12 bytes blank-padded
  9111.     ES:DI -> valid shared device table entry
  9112. Return: CF set on error
  9113.         AX = error code (see function 00h)
  9114. --------------------------------------------------
  9115. INT 6F - 10-NET v3.3 - DELETE SHARED DEVICE ENTRY
  9116.     AX = 1503h
  9117.     BX = zero-based index
  9118.     DS:SI -> node ID, 12 bytes blank-padded
  9119. Return: CF set on error
  9120.         AX = error code (see function 00h)
  9121. --------------------------------------------------
  9122. INT 6F - 10-NET v3.3 - MOUNT
  9123.     AH = 17h
  9124.     AL = local drive number (0=A:)
  9125.     BL = remote drive letter or '1'..'3' for LPTn or '4' or '5' for COMx
  9126.     DS:DX -> node ID, 12 bytes blank-padded
  9127. Return: CF set on error
  9128.         AX = error code (see function 00h)
  9129. --------------------------------------------------
  9130. INT 6F - 10-NET v3.3 - UNMOUNT
  9131.     AH = 18h
  9132.     AL = local drive number (0=A:)
  9133.     BL = type
  9134.         00h        disk
  9135.         01h-03h LPTn
  9136.         04h,05h COMx
  9137. Return: CF set on error
  9138.         AX = error code (see function 00h)
  9139. --------------------------------------------------
  9140. INT 70 - IRQ8 (AT/XT286/PS50+) - REAL-TIME CLOCK
  9141. --------------------------------------------------
  9142. INT 71 - IRQ9 (AT/XT286/PS50+) - LAN ADAPTER 1
  9143.    rerouted to INT 0A by BIOS
  9144. --------------------------------------------------
  9145. INT 72 - IRQ10 (AT/XT286/PS50+) - RESERVED
  9146. --------------------------------------------------
  9147. INT 73 - IRQ11 (AT/XT286/PS50+) - RESERVED
  9148. --------------------------------------------------
  9149. INT 74 - IRQ12 (PS50+) - MOUSE INTERRUPT
  9150. --------------------------------------------------
  9151. INT 75 - IRQ13 (AT/XT286/PS50+) - 80287 ERROR
  9152.    rerouted to INT 02 by BIOS
  9153. --------------------------------------------------
  9154. INT 76 - IRQ14 (AT/XT286/PS50+) - FIXED DISK
  9155. --------------------------------------------------
  9156. INT 77 - IRQ15 (AT/XT286/PS50+) - RESERVED
  9157. --------------------------------------------------
  9158. INT 78 - not used
  9159. --------------------------------------------------
  9160. INT 79 - not used
  9161. --------------------------------------------------
  9162. INT 7A - Novell NetWare - LOW-LEVEL API
  9163. --------------------------------------------------
  9164. INT 7A - AutoCAD Device Interface
  9165. --------------------------------------------------
  9166. INT 7B - not used
  9167. --------------------------------------------------
  9168. INT 7C - not used
  9169. --------------------------------------------------
  9170. INT 7D - not used
  9171. --------------------------------------------------
  9172. INT 7E - not used
  9173. --------------------------------------------------
  9174. INT 7F - not used
  9175. --------------------------------------------------
  9176. INT 80 - reserved for BASIC
  9177. --------------------------------------------------
  9178. INT 81 - reserved for BASIC
  9179. --------------------------------------------------
  9180. INT 82 - reserved for BASIC
  9181. --------------------------------------------------
  9182. INT 83 - reserved for BASIC
  9183. --------------------------------------------------
  9184. INT 84 - reserved for BASIC
  9185. --------------------------------------------------
  9186. INT 85 - reserved for BASIC
  9187. --------------------------------------------------
  9188. INT 86 - Relocated (by NETBIOS) INT 18
  9189. --------------------------------------------------
  9190. INT 86 to F0 - used by BASIC while in interpreter
  9191. --------------------------------------------------
  9192. INT E0 - CP/M-86 function calls
  9193. --------------------------------------------------
  9194. INT E4 - Logitech Modula v2.0 - MonitorEntry
  9195.     AX = 0005h
  9196.     BX = priority
  9197. --------------------------------------------------
  9198. INT E4 - Logitech Modula v2.0 - MonitorExit
  9199.     AX = 0006h
  9200. --------------------------------------------------
  9201. INT EF - GEM - INTERFACE
  9202.     CX = 0473h
  9203.     DS:DX -> GEM parameter block
  9204. --------------------------------------------------
  9205. INT F0 - used by BASIC while in interpreter
  9206. --------------------------------------------------
  9207. INT F1 - reserved for user interrupt
  9208. --------------------------------------------------
  9209. INT F2 - reserved for user interrupt
  9210. --------------------------------------------------
  9211. INT F3 - reserved for user interrupt
  9212. --------------------------------------------------
  9213. INT F4 - reserved for user interrupt
  9214. --------------------------------------------------
  9215. INT F5 - reserved for user interrupt
  9216. --------------------------------------------------
  9217. INT F6 - reserved for user interrupt
  9218. --------------------------------------------------
  9219. INT F7 - reserved for user interrupt
  9220. --------------------------------------------------
  9221. INT F8 - 10 ms INTERVAL TIMER (TANDY???)
  9222. --------------------------------------------------
  9223. INT F9 - reserved for user interrupt
  9224. --------------------------------------------------
  9225. INT FA - USART READY (RS-232C) (TANDY???)
  9226. --------------------------------------------------
  9227. INT FB - USART Rx READY (keyboard) (TANDY???)
  9228. --------------------------------------------------
  9229. INT FC - reserved for user interrupt
  9230. --------------------------------------------------
  9231. INT FD - reserved for user interrupt
  9232. --------------------------------------------------
  9233. INT FE - AT/XT286/PS50+ - destroyed by return from protected mode
  9234. --------------------------------------------------
  9235. INT FF - AT/XT286/PS50+ - destroyed by return from protected mode
  9236. --------------------------------------------------
  9237. INT FF - Z100 - WARM BOOT
  9238. --------------------------------------------------